筛选全局MSBuild项

筛选全局MSBuild项,msbuild,Msbuild,从定义各种xml内容文件的.csproj开始。 具有代码生成目标,它接受一些xml文件(目标输入),并生成.cs文件,这些文件的名称由xml文件(目标输出)的转换决定。 为了让MSBuild确定是否需要运行代码构建目标,它需要检查目标输入和输出因此,我假设这些目标输入和输出必须是全局的。 如果这是不正确的,那么应该有另一个问题,关于如何创建一个目标谁的输出是基于动态项目;试过了,但目标一直被呼叫 如果它是正确的,那么如何在全局级别过滤内容? 具体来说,我希望筛选项目中的内容项,以便只使用特定目录

从定义各种xml内容文件的.csproj开始。 具有代码生成目标,它接受一些xml文件(目标输入),并生成.cs文件,这些文件的名称由xml文件(目标输出)的转换决定。 为了让MSBuild确定是否需要运行代码构建目标,它需要检查目标输入和输出因此,我假设这些目标输入和输出必须是全局的。

如果这是不正确的,那么应该有另一个问题,关于如何创建一个目标谁的输出是基于动态项目;试过了,但目标一直被呼叫

如果它是正确的,那么如何在全局级别过滤内容? 具体来说,我希望筛选项目中的内容项,以便只使用特定目录中的内容项。内容项将由其他开发人员通过IDE添加

这可以通过使用创建动态项的目标,在条件属性中进行过滤来实现。这需要目标批处理,而目标批处理在全局范围内不可用。使用MSBuild 3.5和Visual Studio 2008

<?xml version="1.0" encoding="utf-8"?>
<Project 
    DefaultTargets="Show" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <Content Include="badxml\somebadxml1.xml" />
        <!-- Note xml\somexml2.xml exists on disk, it just isn't used in this project. -->
        <Content Include="xml\somexml1.xml" />
        <Content Include="xml\somexml3.xml" />
    </ItemGroup>

    <!-- Foo should only be defined for Content Items in the "xml" directory. -->
    <ItemGroup>
        <Foo Include="@(Content->'%(Filename)')"/>
        <!-- The line below doesn't work -->
        <!-- TestFilter.proj(10,10): error MSB4090: Found an unexpected character '%' at position 3 in condition " '%(Content.RelativeDir)'=='xml' ". -->
        <!-- <Foo Condition=" '%(Content.RelativeDir)'=='xml' " Include="@(Content->'%(Filename)')"/> -->
    </ItemGroup>

    <Target Name="ShowContent">
        <Message Text="Content: %(Content.Identity)" />
        <Message Text="Content RelDir: %(Content.RelativeDir)" />
    </Target>
    <Target Name="ShowFoo">
        <Message Text="Foo: %(Foo.Identity)" />
    </Target>
    <Target Name="Show">
        <CallTarget Targets="ShowContent;ShowFoo" />
    </Target>
</Project>

解决同样的问题,但从询问为什么这不起作用的角度出发,而不是寻找替代方法

使用目标中的动态项和虚拟输出名称


我的最佳猜测是,如果不在目标中使用动态项,这是无法实现的,解决方法是使用需要条件的项,写出一个具有预定义名称的文件,并将其用作输出占位符。

因此,我的假设是不正确的。基于动态项的目标输出是完全可以接受的。记住目标是根据输出定义进行批处理的,这很有帮助

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="TestBatch"
 xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Static Item declaration. -->
  <ItemGroup>
    <Bar Include="Static01">
      <Data>Static01 Data</Data>
    </Bar>
  </ItemGroup>

  <Target Name="PreBatchTarget">
    <!-- Dynamic Item addition. -->
    <ItemGroup>
      <Bar Include="Dynamic01">
        <Data>Dynamic01 Data</Data>
      </Bar>
    </ItemGroup>
  </Target>

  <Target Name="TestBatchTarget"
      Outputs="%(Bar.Data)"
      >
    <Message Text="TestBatchTarget call" />
    <Message Text="@(Bar)" />
  </Target>

  <Target Name="TestBatch"
          DependsOnTargets="PreBatchTarget;TestBatchTarget"
          >

  </Target>
</Project>

msbuild /nologo DynamicTargetOutput.proj
Project "DynamicTargetOutput.proj" on node 0 (default targets).
  TestBatchTarget call
  Static01
TestBatchTarget:
  TestBatchTarget call
  Dynamic01
Done Building Project "DynamicTargetOutput.proj" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.09

Static01数据
动态C1数据
msbuild/nologo DynamicTargetOutput.proj
节点0上的项目“DynamicTargetOutput.proj”(默认目标)。
TestBatchTarget调用
静态01
TestBatchTarget:
TestBatchTarget调用
动态C1
已完成构建项目“DynamicTargetOutput.proj”(默认目标)。
构建成功。
0个警告
0个错误
时间流逝00:00:00.09

所以我的假设是不正确的。基于动态项的目标输出是完全可以接受的。记住目标是根据输出定义进行批处理的,这很有帮助

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="TestBatch"
 xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Static Item declaration. -->
  <ItemGroup>
    <Bar Include="Static01">
      <Data>Static01 Data</Data>
    </Bar>
  </ItemGroup>

  <Target Name="PreBatchTarget">
    <!-- Dynamic Item addition. -->
    <ItemGroup>
      <Bar Include="Dynamic01">
        <Data>Dynamic01 Data</Data>
      </Bar>
    </ItemGroup>
  </Target>

  <Target Name="TestBatchTarget"
      Outputs="%(Bar.Data)"
      >
    <Message Text="TestBatchTarget call" />
    <Message Text="@(Bar)" />
  </Target>

  <Target Name="TestBatch"
          DependsOnTargets="PreBatchTarget;TestBatchTarget"
          >

  </Target>
</Project>

msbuild /nologo DynamicTargetOutput.proj
Project "DynamicTargetOutput.proj" on node 0 (default targets).
  TestBatchTarget call
  Static01
TestBatchTarget:
  TestBatchTarget call
  Dynamic01
Done Building Project "DynamicTargetOutput.proj" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.09

Static01数据
动态C1数据
msbuild/nologo DynamicTargetOutput.proj
节点0上的项目“DynamicTargetOutput.proj”(默认目标)。
TestBatchTarget调用
静态01
TestBatchTarget:
TestBatchTarget调用
动态C1
已完成构建项目“DynamicTargetOutput.proj”(默认目标)。
构建成功。
0个警告
0个错误
时间流逝00:00:00.09