【问题标题】:msbuild target - AfterTargets="Build" for the solution?msbuild target - AfterTargets="Build" 的解决方案?
【发布时间】:2021-05-14 04:02:24
【问题描述】:

我正在寻找一种方法,在每个构建过程中只运行一次我定义的Target,而不是对每个构建的项目。

我在Directory.Build.props中定义了以下内容

<Target Name="MyTarget" AfterTargets="AfterBuild" >

    <Message Text="Hello World!!!" Importance="High" />

</Target>

无论msbuild 进程正在构建多少个项目,都应该只运行一次,目前每个项目都会发生这种情况。

在 Visual Studio 中点击 (Re-)Build Soltution(Re-)Build [ProjectName] 或点击 F5 无关紧要,只要发生任何构建,我只想执行一次 MyTarget

【问题讨论】:

  • 我想你希望目标被执行一次,然后当你第二次构建它时,它不会被执行,对吧?
  • @PerryQian-MSFT - 例如我有一个包含 3 个项目的解决方案,我点击 Build Solution 构建所有 3 个项目,如果我点击 Build Project B,它应该只执行一次,但是内部构建过程决定,因为它需要在项目 B 之前构建项目 A 我仍然希望只运行一次,所以基本上当我点击任何构建操作时,msbuild 决定做什么我的愿望是只运行一次东西当一切都完成时
  • 但是如果新的构建过程开始,它应该再次运行一次
  • @PerryQian-MSFT - 万一你有兴趣或想知道我为什么需要这个,在这里你会找到一个深入的解释 - github.com/NuGet/Home/issues/10560
  • 我的回答对您处理问题有帮助吗?

标签: visual-studio msbuild csproj msbuild-task


【解决方案1】:

只要回答这种情况:

如果我的猜测是正确的,纯 msbuild 函数是不够的,你必须使用外部文件来帮助它工作。

在解决方案文件夹中创建一个名为test.txt 的文件,并将0 写入txt 文件中。

然后,像这样修改您的Directory.Build.props

<Project>
<PropertyGroup>
  <Record></Record>
</PropertyGroup>
<ItemGroup>
    <File Include="..\test.txt"></File>
</ItemGroup>
    <Target Name="GetConditionValue" BeforeTargets="PrepareForBuild">
  
    <ReadLinesFromFile File="@(File)">
        <Output TaskParameter="Lines" PropertyName="Record"/>
      </ReadLinesFromFile>
    </Target>
    
    
<Target Name="MyTarget" AfterTargets="Build" Condition="'$(Record)'=='0'">

 <WriteLinesToFile File="@(File)" Lines="2" Overwrite="true"></WriteLinesToFile>

  <Message Text="Hello World!!!" Importance="High" />
  </Target>

</Project>

当您开始一个新的构建过程时,您应该将 test.txt 文件清除到0 以重新开始。

【讨论】:

  • When you start a new build process, you should clear the test.txt file to 0 to make a new start. - 这是否意味着我必须手动更改文本文件?所以在 Visual Studio 中点击 Build Soltuion 之前,我需要将其更改为 0 - 每次?
  • 是的。如果你想让它更容易、更自动化,你可以使用批处理文件来清除它。
  • 只是一个随机的想法,是否有一个宏知道要构建多少个项目?如果是这样,也许我可以为每个构建写一行,然后检查行数是否与宏匹配,做我的事情并重置文件?!?
  • ...我不知道是否有任何 msbuild 属性可以实现这一点。我的方法的前提是我需要一个灵活的、现实的、可控的标识符。如果这个 MSBuild 宏真的存在,我必须修改它,我不知道他对构建有多大影响,另外,第二次构建会将它重置为默认值,实际上是所有 msbuild 属性。并且更改的值应该在一些不受 msbuild 控制的实际文件上恢复,然后从该文件中读取它。整个过程不会被msbuild控制。所以,一个txt文件会更好。
  • 而且我不知道这种类型的宏。如果是这样,您还应该通过我的函数修改该值,我不确定它对构建有多大影响。此外,如果您不使用附加文件,如何存储不受每个构建控制的值是一个问题,不使用文件可能会使它变得更加困难,该宏将在每次构建时重置,当您使用 msbuild 读取该值,它已经设置为默认值。所以使用额外的文件不会引起这样的困惑。制作一个bat文件来清除它。整个功能虽然不完美,但可能会导致更少。
猜你喜欢
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2013-03-03
  • 2010-12-21
相关资源
最近更新 更多