我如何创建一个循环来编译我的项目并增加一些选项?

How can I create a cycle of compiling my project with incrementing of some option?

我编写了一个 C# 模板来创建 AutoCAD 的 .Net 扩展。以前,对于每个 AutoCAD 版本,都需要指向单独的引用集、输出目录、目标 .Net Framework 平台等。存在许多版本的 AutoCAD:AutoCAD 2009、2010、...、2015。现在我的模板代替我去做。我的 csproj-文件有 CAD_Year 属性:

<PropertyGroup>
  <CAD_Year>2013</CAD_Year>
  <Min_Year>2009</Min_Year>
  <Max_Year>2015</Max_Year>
</PropertyGroup>

当我更改 CAD_Year 值时(在 csproj 文件中手动编辑此选项)- 我的项目的所有设置也会根据目标 AutoCAD 版本进行更改。效果很好。

但是我需要为所有版本的 AutoCAD 编译我的代码总是...为此每次更改 CAD_Year 是不方便的...: (((

当我按下 Rebuild Solution 菜单项时,如何为 Min_Year、...、Max_Year 版本创建项目编译周期?

如果将此添加到项目文件中:

<ItemGroup>
  <CADYears Include="2013;2014;2015"/>
</ItemGroup>

<Target Name="BatchRebuild">
  <Msbuild Projects="$(MsBuildThisFile)" Targets="Rebuild" Properties="CAD_Year=%(CADYears.Identity)"/>
</Target>

并致电

msbuild <path_to_projectfile> /t:BatchRebuild

在命令行上,它将构建 path_to_projectfile 3 次,每次使用不同的 CAD_Year 属性.

要让 VS 调用它比较棘手,因为您需要覆盖重建目标,但这例如适用于 VS2013(Actualrebuild 目标是从 C:\ 中的 Rebuild 目标复制的程序文件 (x86)\MSBuild.0\Bin\Microsoft.Common.CurrentVersion.targets):

<ItemGroup>
  <CADYears Include="2013;2014;2015"/>
</ItemGroup>

<Target Name="ActualRebuild"
        Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
        DependsOnTargets="$(RebuildDependsOn)"
        Returns="$(TargetPath)"/>

<Target Name="BatchRebuild">
  <Msbuild Projects="$(MsBuildThisFile)" Targets="ActualRebuild" Properties="CAD_Year=%(CADYears.Identity)"/>
</Target>

<Target Name="Rebuild">
  <Msbuild Projects="$(MsBuildThisFile)" Targets="BatchRebuild"/>
</Target>

编辑 由于 VS 中的模板系统试图复制它在项目根目录中找到的项目组(这对我来说似乎是一个错误,或者至少是一个非常烦人的功能)你可以通过使用 属性 并转换它来解决这个问题需要时放入项目:

<PropertyGroup>
  <CADYears>2013;2014;2015<CADYears/>
</PropertyGroup>

<Target Name="BatchRebuild">
  <ItemGroup>
    <CADYearsItem Include="$(CADYears)"/>
  </ItemGroup>
  <Msbuild Projects="$(MsBuildThisFile)" Targets="Rebuild" Properties="CAD_Year=%(CADYearsItem .Identity)"/>
</Target>

注意:在您在 link 中发布的项目中,您正在调用 Afterbuild 目标中的 Rebuild 目标。我没有尝试过,但这几乎肯定会导致无限递归。所以你应该坚持使用上面发布的带有单独目标的解决方案。

谢谢@stijn。我会将您的回答标记为解决方案。这里我创建了一个 "answer" 用于代码高亮显示。我当前的代码有效:

  <!-- Redefine the CoreClean target, otherwise MSBuild will remove all results 
    of building except for the last. -->  
  <Target Name="CoreClean">
    <ItemGroup>
      <AllFiles Include="$(OutputPath)\*.*" />
    </ItemGroup>
    <Copy SourceFiles="@(AllFiles)" DestinationFolder="$(OutputPath)\temp" />
  </Target>

  <Target Name="BatchRebuild">
    <ItemGroup>
      <CADYearsItem Include="$(BuildFor)" />
    </ItemGroup>
    <Msbuild Projects="$(MsBuildThisFile)" Targets="Rebuild" Properties="CAD_Year_Platform=%(CADYearsItem.Identity)" />

    <ItemGroup>
      <AllFilesBack Include="$(OutputPath)\temp\*.*" />
    </ItemGroup>
    <Move SourceFiles="@(AllFilesBack)" DestinationFolder="$(OutputPath)" />
    <!-- Doesn't work for Debug. The $(OutputPath)\temp\ will not removed. 
      But it work for Release.-->
    <RemoveDir Directories="$(OutputPath)\temp\" /> 
  </Target>

我明白了,RemoveDir 任务对我来说对 Debug 不起作用,但这不是什么大问题。现在我的模板已经完成,我将对其进行重构。非常感谢!