我按照NuGet中的Bundling .NET构建工具教程,它适用于我。但是如果仔细查看调用该工具的项目中包含的目标文件,您会注意到它定义的其中一个属性是引用的而另一个不是:
<PropertyGroup>
<TypescriptOutput>"$(MSBuildProjectDir)/wwwroot/ts-gen/"</TypescriptOutput>
<NamespaceFilter>$(RootNamespace).Typescript</NamespaceFilter>
</PropertyGroup>
原因似乎是在工具自己的项目的上下文中评估了不带引号的属性,而引用的属性作为文字传递,因此可以在调用该工具的项目的上下文中对它们进行求值。
所以这是我的目标文件,它包含在调用我的工具的项目中:
<Project>
<PropertyGroup>
<NSwagClientGeneratorExe Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework'">$(MSBuildThisFileDirectory)net47\NSwagClientGenerator.exe</NSwagClientGeneratorExe>
<NSwagClientGeneratorConfig>"NSwagClientGenerator.$(Configuration).json"</NSwagClientGeneratorConfig>
<NSwagClientGeneratorOutput>"$(IntermediateOutputPath)NSwagClientGenerator.g.cs"</NSwagClientGeneratorOutput>
</PropertyGroup>
<Target Name="NSwagClientGeneratorGenerate" Inputs="$(NSwagClientGeneratorConfig)" Outputs="$(NSwagClientGeneratorOutput)">
<Message Importance="high" Text="NSwagClientGenerator: generating clients for $(Configuration)" />
<Exec Command="$(NSwagClientGeneratorExe) $(NSwagClientGeneratorConfig) $(NSwagClientGeneratorOutput)" />
</Target>
<Target Name="NSwagClientGeneratorInclude" BeforeTargets="CoreCompile" DependsOnTargets="NSwagClientGeneratorGenerate">
<ItemGroup Condition="Exists($(NSwagClientGeneratorOutput))">
<Compile Include="$(NSwagClientGeneratorOutput)" />
<FileWrites Include="$(NSwagClientGeneratorOutput)" />
</ItemGroup>
</Target>
</Project>
注意如何NSwagClientGeneratorConfig
和NSwagClientGeneratorOutput
被引用。这会导致在调用我的工具的项目的上下文中对它们进行求值,因此使用正确的命令行参数调用该工具。这很有效。
问题是让生成的源包含在构建中。这部分实际上在我的文件名属性没有被引用之前工作,因此我使用了错误的文件名。但现在引用了属性,Exists($(NSwagClientGeneratorOutput))
条件不再正确。我想我想做的就是评估$(NSwagClientGeneratorOutput)
所以它包含的变量会扩展到正确的路径。我怎么做?我猜测可能有一个叫做的函数Eval
,但显然不是。
发布于 2018-12-11 14:17:44
这最终成为XY问题。希望在Property Functions的文档中找到“eval”函数,我发现了这一点:
所有构建属性值都只是字符串值。您可以使用字符串(实例)方法对任何属性值进行操作。
所以这适用于我的特殊情况:
<ItemGroup Condition="Exists($(NSwagClientGeneratorOutput.Trim('"')))">
<Compile Include="$(NSwagClientGeneratorOutput.Trim('"'))" />
<FileWrites Include="$(NSwagClientGeneratorOutput.Trim('"'))" />
</ItemGroup>
我提出的问题的答案可能是“你做不到”。
https://stackoverflow.com/questions/-100006256
复制相似问题