从外部msbuild目标文件访问项目属性

时间:2016-03-11 19:36:55

标签: msbuild typescript msbuild-task

我有一个共同的compile.targets文件,用于构建许多不同的解决方案。在该文件中,我想检查是否有任何包含的项目正在使用TypeScript,如果是,请验证是否在这些项目中设置了某些属性(即TypeScriptNoImplicitAny)。我目前正在构建解决方案:

  <Target Name="my-compile-target">
    <MSBuild Projects="%(SolutionFile.FullPath)"/>
  </Target>

我希望能够为解决方案中的每个.csproj创建一个可以访问.csproj中设置的所有属性的任务。

这可能吗?我尝试的一个解决方法是使用BeforeTargets属性以及我知道用于编译TypeScript的目标:

<Target Name="check-typescript-options" BeforeTargets="CompileTypeScript;CompileTypeScriptWithTSConfig">
    <Message Condition="'$(TypeScriptToolsVersion)' != ''" Text="Tools Version is $(TypeScriptToolsVersion)"></Message>
    <Message Condition="'$(TypeScriptToolsVersion)' == ''" Text="No tools version found"></Message>
</Target>

不幸的是,MSBuild向我发出警告,指出那些TypeScript目标不存在,因此忽略了check-typescript-options

1 个答案:

答案 0 :(得分:1)

正如您所说,您需要在各个csproj文件的上下文中“运行”。为此,根据您的设置,我将设置两个属性之一

CustomAfterMicrosoftCSharpTargets CustomAfterMicrosoftCommonTargets

最简单的方法是设置这些

<Target Name="my-compile-target">
    <MSBuild Projects="%(SolutionFile.FullPath)"
             Properties="CustomAfterMicrosoftCSharpTargets=$(PathToCustomTargetProj);"  />
</Target>

在这种情况下,您将 $(PathToCustomTargetProj)设置为某个文件路径,该路径具有在csproj管道中运行的目标。您可以将其设置为 compile.targets ,然后将调用 check-typescript-options ,因为 BeforeTargets 将被正确评估和满足。