我有一个MSBUILD脚本,该脚本只是做我需要做的一切,除了我的后构建步骤外(请参阅我问的一个问题: MSBUILD有条件执行?).

我想做的是构建许多CSPROJ文件,并在构建项目时选择执行后构建步骤。我不想一直执行我的后构建步骤,否则我的最终输出时间戳将不必要地修改(这使得构建过程无缘无故地耗时非常耗时)。

在我的msbuild脚本中,我的每个csproj文件都有以下内容:

<Target Name="ProjectName">
   <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" />
</Target>

编辑:我认为我真正想做的是检测每个项目的CoreCompile任务何时运行。如果有某种方法可以在某种情况下检查一下吗?

有任何想法吗?

我是MSBuild的新手,所以也许我完全走错了曲目!

谢谢,艾伦

有帮助吗?

解决方案 2

经过大量寻找这个问题的简单解决方案,我找不到一个问题,最终提出了自己的解决方案,但可能不是最好的解决方案。但是,我想与其他遇到相同问题的人分享它,以便您至少可以有一个工作解决方案,并希望为您节省大量的敲打。

回顾一下,我想做的是在建立项目后运行命令行工具,但只有更新了组件(即时间戳更改)。我不想将其放入每个项目的后构建部分,因为我只希望在我们的构建服务器(不是开发机器)上发生后构建。

我找不到在我的主.proj文件中进行外部执行此操作的任何方法,最终确实更改了每个.csproj文件的后构建部分。但是,我以这样的条件为前缀:

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>

正如我说的那样,我认为这不是最优雅的解决方案,但它肯定有效,暂时对我来说足够了。但是,我仍然有兴趣听听如何实现这一目标的方法,以便我可以改进脚本。

谢谢,艾伦

其他提示

您也可以根据构建过程中选择的配置来执行此操作。对于CI,您应始终使用“释放”或“生产”(您可以定义自己的)

<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/>

如果您可以将以下内容添加到每个项目中:

<Target Name="DoStuffWithNewlyCompiledAssembly">
    <Exec Command="command.exe" />
</Target>

...然后您只需要添加一个属性:

<Target Name="Name">
  <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" />
</Target>

这是因为在Microsoft上聪明的人添加了以下行 CoreCompile 目标in Microsoft.[CSharp|VisualBasic][.Core].targets (文件名取决于语言和MSBuild/Visual Studio版本)。

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

因此,如果您在 TargetsTriggeredByCompilation 属性,如果您的目标将运行 CoreCompile 运行 - 如果您的目标不会运行 CoreCompile 被跳过(例如,输出组件已经相对于代码是最新的)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top