MSBuild:如何在Silverlight构建中包含“* .xaml”和“* .cs”?

时间:2010-08-10 07:33:11

标签: silverlight msbuild

我想使用MSBuild来抓取并创建2个文件的相关元素。如果它只是一个文件扩展名,我会使用:

<ItemGroup>
    <Compile Include="\Pages\*.cs" /> 
</ItemGroup>

在Silverlight构建的.csproj文件中,每个UserControl都设置为与其自己的<Compile>元素和子<DependentUpon>元素一样:

<ItemGroup>
    <Compile Include="Pages\SilverlightControl1.xaml.cs">
        <DependentUpon>SilverlightControl1.xaml</DependentUpon>
    </Compile>
    <Compile Include="Pages\SilverlightControl2.xaml.cs">
        <DependentUpon>SilverlightControl2.xaml</DependentUpon>
    </Compile>
</ItemGroup>

在MSBuild文件中,我想指定:

  

抓取所有.cs个文件   把它们放在Include   属性并获取相同的文件名 - 减去.cs并将其放在<DependentUpon>元素中。

这样就像(伪)匹配文件对:

<ItemGroup>
    <Compile Include="Pages\*.cs">
        <DependentUpon>Pages\*.xaml</DependentUpon>
    </Compile>
</ItemGroup>

有没有办法将上面的内容放在MSBuild中?

2 个答案:

答案 0 :(得分:4)

MSBuild有两个独立的元数据属性,名为%(Filename)(没有扩展名的文件名)和%(Extension),在您的示例中为“.cs”。所以,我想知道这是否可能:

<ItemGroup>
    <Compile Include="Pages\*.cs">
        <DependentUpon>%(Directory)%(Filename)</DependentUpon>
    </Compile>
</ItemGroup>

但是,我认为你不会喜欢它会做什么甚至做你想做的事情。

你真的只应该在目标中拥有“glob”类型的项目(* .cs) - 你不应该将它声明为顶级项目组,否则它会在视觉上做有趣的事情studio和(例如)将所有.cs文件添加到版本控制中,甚至可以将* .cs扩展为项目中的各个项目。

以下是我在NON Visual Studio msbuild项目中的建议:

<Target Name="PrepareCompileItems">
    <XamlFiles Include="Pages\*.cs">
        <DependentUpon>%(Directory)%(Filename)</DependentUpon>
    </XamlFiles>

    <Compile Include="@(XamlFiles)" />
</Target>

如果您在VS项目中执行此操作,那么它就是诡计 - 您希望元数据添加到已存在的项目组以在编译之前强制slaveUpon关联:

<Target Name="AddDependentUponMetadata">
    <CsFiles Include="Pages\*.cs" />

    <XamlFiles Include="@(CsFiles)">
        <DependentUpon>%(Directory)%(Filename)</DependentUpon>
    </XamlFiles>

    <Compile Remove="@(CsFiles)" />    
    <Compile Include="@(XamlFiles)" />
</Target>

虽然,我正在输入这个而没有实际测试我的断言,所以YMMV ......

答案 1 :(得分:2)

在MsBuild中,您可以执行以下操作:

<ItemGroup>
        <ClassFiles Include="**\*.cs"/>
        <XamlFiles Include="**\*.xaml"/>
        <Compile  Include="@(ClassFiles)" > 
            <DependentUpon>"@(XamlFiles)"</DependentUpon>
        </Compile>
     </ItemGroup>

这是你想要的还是我的问题?