从MSBuild任务中获取属性值

时间:2018-08-21 08:20:08

标签: msbuild

我的情况如下。 我有一个.targets文件,该文件可以执行某些操作,例如

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!--Some UsingTask here-->
  <PropertyGroup>
    <CustomProperty1>MyFirstValue</CustomProperty1>
    <CustomProperty2>MySecondValue</CustomProperty2>
  <Target Name="AfterResolveReferences">
    <MSBuild Projects="MyProjectLocation\MyProject.csproj" Properties="CustomProperty1=$(CustomProperty1);CustomProperty2=$(CustomProperty2)" Targets="Rebuild" />
    <Message Text="CodeGenerated = $(CodeGenerated)" />
  </Target>
  <Target Name="CodeGeneratedSpecificStuff" Condition="$(CodeGenerated) == 'true'">
    <!--Stuff happens-->
  </Target>
  <!--More targets and bits and pieces-->
</Project>

MyProject.csproj看起来像这样:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
  <!--Some property groups with some properties-->
  <!--Also Compile includes etc as expected in a .csproj file-->
  <Target Name="BeforeBuild" DependsOnTargets="GenerateCode">
    <ItemGroup Condition="$(CodeGenerated) == 'true'">
      <Compile Include="MyGeneratedCode.cs" />
    </ItemGroup>
  </Target>
  <Target Name="GenerateCode">
    <MyCodeGenerationCustomTask MyOperationalProperty="$(CustomProperty1)">
      <Output TaskParameter="CodeGenerated" PropertyName="CodeGenerated" />
    </MyCodeGenerationCustomTask>
  </Target>
</Project>

我想要实现的是将来自我的MyCodeGenerationCustomTask的“ CodeGenerated”属性插入.csproj文件中,以进入我的.targets文件。

到目前为止我尝试过的是: 在.targets文件中的MSBuild调用中将“ CodeGenerated”属性传递为空。 在MSBuild任务下指定一个“输出”元素(由于MSBuild任务没有“ CodeGenerated”属性而无法使用...)

我还尝试将.csproj文件中的“ BeforeBuild”目标和“ Project”元素上的“ Outputs”设置为“ $(CodeGenerated)”(Msbuild并没有抱怨Outputs标记的存在在Project元素上,因此我想也可以尝试一下),但Value不会冒泡到.targets文件。在.targets文件中,我还更改了MSBuild任务,使其看起来像这样:

<MSBuild Projects="MyProjectLocation\MyProject.csproj" Properties="CustomProperty1=$(CustomProperty1);CustomProperty2=$(CustomProperty2)" Targets="Rebuild">
  <Output TaskParameter="TargetOutputs" PropertyName="CodeGenerated" />
</MSBuild>

但是,正如我希望的那样,它仅包含MSBuild任务生成的文件列表。

重要的是要注意代码生成工作正常,并且.csproj文件中的CodeGenerated属性可以正常运行,并有条件地包含用于编译的cs文件。

这可能吗?我只是撞墙撞头吗?还是我错过了一些MSBuild魔术? 我真正想要避免的是在检查.cs特定位置是否存在的每个级别上。

0 个答案:

没有答案