我想使用MSBuild来抓取并创建2个文件的relevent元素。如果只是单个文件扩展名,我将使用:
<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文件中,我想指定:
这样匹配文件对就像(pseudo)一样:
<ItemGroup>
<Compile Include="Pages\*.cs">
<DependentUpon>Pages\*.xaml</DependentUpon>
</Compile>
</ItemGroup>
有没有办法将以上内容放入MSBuild?
最佳答案
MSBuild具有两个单独的元数据属性,分别称为%(Filename)
(不带扩展名的文件名)和%(Extension)
(在您的示例中为“.cs”)。因此,我想知道这是否可能:
<ItemGroup>
<Compile Include="Pages\*.cs">
<DependentUpon>%(Directory)%(Filename)</DependentUpon>
</Compile>
</ItemGroup>
但是,我认为您不会喜欢它会做的事情,甚至不会喜欢您想要做的事情。
您实际上应该只在目标中包含“全局”类型的项目(* .cs)-您不应将其声明为顶级项目组,否则它将在Visual Studio中做一些有趣的事情,并且(例如)将添加所有.cs文件进行版本控制,甚至可以将* .cs扩展为项目中的各个项目。
这是我在NON Visual Studio msbuild项目中建议的内容:
<Target Name="PrepareCompileItems">
<XamlFiles Include="Pages\*.cs">
<DependentUpon>%(Directory)%(Filename)</DependentUpon>
</XamlFiles>
<Compile Include="@(XamlFiles)" />
</Target>
如果您是在VS项目中执行此操作,那么就很麻烦了-因为您希望将元数据添加到已经存在的项目组中,以在编译之前强制dependentUpon关联:
<Target Name="AddDependentUponMetadata">
<CsFiles Include="Pages\*.cs" />
<XamlFiles Include="@(CsFiles)">
<DependentUpon>%(Directory)%(Filename)</DependentUpon>
</XamlFiles>
<Compile Remove="@(CsFiles)" />
<Compile Include="@(XamlFiles)" />
</Target>
虽然,我在输入时没有实际测试我的断言,所以YMMV ...
关于silverlight - MSBuild:如何在Silverlight版本中同时包含 "*.xaml"和 "*.cs"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3446919/