我想使用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/

10-17 01:05