c# - 您可以在AdditionalProperties或Properties Item Metadata中使用msbuild批处理 - 特别是Configurations属性。

c# - 您可以在AdditionalProperties或Properties Item Metadata中使用msbuild批处理 - 特别是Configurations属性。,第1张

我正在尝试使用AdditionalProperties元数据中的批处理来为Debug构建一个csproj两次,使用Configuration属性构建一个用于Build。

传统上你会看到:

<ItemGroup>
    <MyConfigurations Include="Release"/>
    <MyConfigurations Include="Debug"/>
  </ItemGroup>
<Task>
<MSBuild Projects="@(ProjectsToBuild)"
         BuildInParallel="true"
         Configurations="%(MyConfigurations.Identity)"
        />
</Task>

但我想要的是这样的:

    <Project ToolsVersion="12.0" DefaultTargets="CoreBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 ...
      <ItemGroup>
        <MyConfigurations Include="Release"/>
        <MyConfigurations Include="Debug"/>
      </ItemGroup>

      <ItemGroup>
        <ProjectsToBuild Include="$(SourcePath)\somedir\project1.csproj">
          <AdditionalProperties>Configuration=%(MyConfigurations.Identity);PlatformTarget=x86</AdditionalProperties>
        </ProjectsToBuild>
        <ProjectsToBuild Include="$(RootPath)\someOtherMSbuildProject.proj">
          <AdditionalProperties>
            PackageRoot=$(PackageRoot);
            PackagePassword=$(PackagePassword);
          </AdditionalProperties>
        </ProjectsToBuild>
      </ItemGroup>
    <Target Name="CoreBuild">
          <MSBuild 
            Projects="@(ProjectsToBuild)"
            BuildInParallel="true"
            />
      </Target>

这样我可以根据我的理解进行并行构建。我只是MSBUILD的初学者。根据我的理解,第一种批处理方式将阻止并行构建。但是,当我尝试这样做时,我收到一个错误:“没有为项目Project1.csproj指定输出路径...”然后在错误消息中进一步说明它告诉我“Configuration =''Platform ='x86'” 。然后,错误消息继续说我可能没有正确设置配置和平台。看起来是正确的,因为它没有为配置设置任何内容。

我正在尝试做甚么可能吗?我以为是的。我搜索了很多,我在这里找到了这个解决方案:MSDN: MSBuild task: Batching and BuildInParallel=true。此链接类似于我尝试的操作,但不是像AdditionalProperties元数据中那样使用Configuration:

Configuration="%(MyConfigurations.Identity)"

他们使用像

这样的配置
Config="%(MyConfigurations.Identity)".

我不知道Config的来源或使用它的原因。当我尝试使用它时,只会构建Debug。

如果我为csproj创建一个单独的Item - 一个用于Configuration = Debug,另一个用于Configuration = Release,那么它按预期工作。但我正在寻找一种方法来防止必须为.csproj创建两个单独的项目才能获得这两个版本。

我现在尝试了很多东西,我有点困惑。除了上面的MSDN链接之外,我找不到任何“Config”参数。我也有Sayad的内部微软构建引擎书,我在那里找不到任何东西。

我正在使用带有12.0工具版的visual studio 13。

最佳答案:

1 个答案:

答案 0 :(得分:0)

好吧,我觉得愚蠢。 Items必须位于Target元素中才能进行批处理。换句话说,批处理仅适用于动态项目。

所以这样:

<Target>
<ItemGroup>
      <ProjectsToBuild2 Include="$(SourcePath)\RapidCoreConfigurator\RapidCoreConfigurator.csproj">
        <AdditionalProperties>Configuration=%(MyConfigurations.Identity);PlatformTarget=x86</AdditionalProperties>
      </ProjectsToBuild2>
    </ItemGroup>

    <Message Text="MyConfigurations: %(MyConfigurations.Identity)"/>
      <MSBuild 
        Projects="@(ProjectsToBuild2)"
        BuildInParallel="true"
        />
</Target>

我确实尝试过,但我一定犯了一些错误;我在尝试这么多东西。

我不确定为什么链接文章中的人使用“Config”而不是“Configuration”,但他可能犯了错误或者已经从记忆中走了。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
U19学习网站 » c# - 您可以在AdditionalProperties或Properties Item Metadata中使用msbuild批处理 - 特别是Configurations属性。