如何在Msbuild目标中获取进程ID

3

如何在目标内获取msbuild进程的进程ID?我想要读取并输出它。

或者,MSBuild是否有某种会话ID可以捕获?

我想要在构建运行期间仅运行一次T4任务,并考虑使用一种条件构建方式。否则它会多次运行。

<TransformOnBuild>false</TransformOnBuild>
<TransformOnBuild Condition="'$(SomeCondition)' == 'true'">false</TransformOnBuild>

请重新表述您的问题(基本上您的最后一段是问题,而其余部分是您正在考虑的可能不起作用的解决方案),并添加更多信息:您所说的“每次构建”是什么意思?您是否正在构建具有多个项目的解决方案,并希望运行任务一次?还是使用自定义构建文件?还是其他什么原因?目标现在是否在每个项目中定义?或者为什么会运行多次? - stijn
1个回答

6
如果您想运行某些内容一次,可以将其包装在目标中,MSBuild无论被调用了多少次都不会执行相同的目标。如果您想要一个简单的互斥锁,可以使用通常的锁文件技术,使用内置的WriteLinesToFileDelete任务,以及InitialTargets。如果您想要实际的进程ID,即正在执行您的任务的(其中之一的)MSBuild节点,可以编写内联任务,请参见下面的示例。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask TaskName="Process" TaskFactory="CodeTaskFactory" AssemblyName="Microsoft.Build.Tasks.v12.0">
    <ParameterGroup>
      <Id ParameterType="System.Int32" Output="true" />
    </ParameterGroup>
    <Task>
      <Code>Id = System.Diagnostics.Process.GetCurrentProcess().Id;</Code>
    </Task>
  </UsingTask>

  <Target Name="Foo">
    <Process>
      <Output PropertyName="Id" TaskParameter="Id" />
    </Process>
    <Message Text="Process $(Id)" />
  </Target>
</Project>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接