我有一个MSBuild脚本,除了我的后期构建步骤之外,还要做我需要做的所有事情(请参阅我之前提出的问题:MSBuild conditional Exec?)。
我正在寻找的是构建许多csproj文件,并且当且仅当项目构建时,可选择执行构建后步骤。我不想一直执行我的后期构建步骤,否则我的最终输出上的时间戳将被不必要地修改(并且它使得构建过程非常耗时)。
在我的MSBuild脚本中,我的每个csproj文件都有以下内容:
<Target Name="ProjectName">
<MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" />
</Target>
修改 我认为我真正想做的是检测CoreCompile任务何时为每个项目运行。如果有某种方法可以在一个条件下检查这个?
有什么想法吗?
我是MSBuild的新手,所以也许我完全走错了轨道!
谢谢, 艾伦
答案 0 :(得分:3)
您也可以根据构建过程中选择的配置来执行此操作。对于CI,您应始终使用“发布”或“生产”(您可以定义自己的)
<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/>
答案 1 :(得分:1)
经过多次寻找这个问题的简单解决方案后,我找不到一个,最终得出了我自己的解决方案,但可能不是最好的解决方案。但是,我想与遇到同样问题的其他人分享,这样你至少可以找到一个有效的解决方案,并希望能为你节省很多头脑。
回顾一下,我想要做的是在我的项目构建之后运行命令行工具,但仅在程序集更新时(即时间戳已更改)。我不想把它放到每个项目的后期构建部分,因为我只想在构建服务器(而不是开发机器)上进行后期构建。
我没有找到任何在我的主.proj文件中外部执行此操作的方法,并且最终改变了每个.csproj文件的构建后部分。但是,我用if这样的条件作为前缀:
if '$(ExecuteCommand)' == 'true' command.exe
这意味着该命令永远不会在开发机器上执行,但是当我从.proj文件调用构建时,我可以将该标志设置为true,如下所示:
<!-- Define common properties -->
<PropertyGroup>
<ExecuteCommand>true</ExecuteCommand>
</PropertyGroup>
<Target Name="YourTarget">
<!-- Build project -->
<MSBuild Projects="Path to project" Properties="ExecuteCommand=$(ExecuteCommand)" />
</Target>
正如我所说,我不认为这是最优雅的解决方案,但它确实有效,对我来说已经足够了。但是,我仍然有兴趣了解实现这一目标的正确方法是什么,以便我可以改进我的脚本。
谢谢, 艾伦
答案 2 :(得分:0)
如果您可以为每个项目添加以下内容:
<Target Name="DoStuffWithNewlyCompiledAssembly">
<Exec Command="command.exe" />
</Target>
...那么你只需要添加一个属性:
<Target Name="Name">
<MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" />
</Target>
这是有效的,因为有人聪明的微软在CoreCompile
Microsoft.[CSharp|VisualBasic][.Core].targets
目标末尾添加了以下行(文件名取决于语言和MSBuild / Visual Studio版本)。
<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>
因此,如果您在TargetsTriggeredByCompilation
属性中指定目标名称,则目标将在CoreCompile
运行时运行 - 如果跳过CoreCompile
,您的目标将无法运行(例如,因为输出程序集已经与代码相关了。)