我的情况如下。 我有一个.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特定位置是否存在的每个级别上。