我如何创建一个循环来编译我的项目并增加一些选项?
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
不起作用,但这不是什么大问题。现在我的模板已经完成,我将对其进行重构。非常感谢!
我编写了一个 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
不起作用,但这不是什么大问题。现在我的模板已经完成,我将对其进行重构。非常感谢!