我想使用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中?
答案 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>
这是你想要的还是我的问题?