将 .csproj 的宏导入 Directory.build.targets 文件?
Importing macros of a .csproj to a Directory.build.targets file?
我在解决方案文件旁边有以下 Directory.build.targets
文件:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<BinaryFormats Include="$(SolutionDir)Projects\BinaryFormats\bin\Debug\netstandard2.1\BinaryFormats.dll" />
<BinaryFormats Include="$(SolutionDir)Projects\BinaryFormats\bin\Debug\netstandard2.1\BinaryFormats.pdb" />
</ItemGroup>
<Target Name="CopyUnityPlugins" AfterTargets="Build">
<Copy SourceFiles="@(BinaryFormats)" DestinationFolder="$(SolutionDir)Assets\Plugins" />
</Target>
</Project>
它的工作是将一些 class 库复制到 $(SolutionDir)Assets\Plugins
并以此实现。
但是有一点,每个要复制的文件路径都是硬编码的。
问题:
是否可以通过某种方式导入 .csproj 的宏并在文件中使用它们?
例如,能够使用以下语法而不是硬编码路径:
<ItemGroup>
<BinaryFormats Include="$(TargetDir)$(TargetName).dll"/>
<BinaryFormats Include="$(TargetDir)$(TargetName).pdb"/>
</ItemGroup>
是的,行得通。 Directory.build.props
和 Directory.build.targets
文件分别评估 对每个项目 分别执行。对于每个项目,相应的宏(例如 $(TargetPath)
或 $(ProjectPath)
)将具有该特定项目的值。所以你上面的例子 <BinaryFormats Include="$(TargetDir)$(TargetName).pdb"/>
应该像写的那样工作。
在附加条件下,您还可以使用这些文件有条件地扩展您的项目。例如,我有一个大型解决方案(100 多个项目),其中 Directory.build.props
包含以下部分:
<ItemGroup Condition="($(MSBuildProjectName.EndsWith('UnitTest')) OR $(MSBuildProjectName.EndsWith('IntegrationTest'))) AND '$(MSBuildProjectExtension)' == '.csproj'">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
</ItemGroup>
这会自动将这两个包添加为对所有单元测试项目(并且仅对这些项目)的引用,这不仅减少了项目文件本身的混乱,而且还允许我仅更改一行代码就可以升级这些包.
我在解决方案文件旁边有以下 Directory.build.targets
文件:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<BinaryFormats Include="$(SolutionDir)Projects\BinaryFormats\bin\Debug\netstandard2.1\BinaryFormats.dll" />
<BinaryFormats Include="$(SolutionDir)Projects\BinaryFormats\bin\Debug\netstandard2.1\BinaryFormats.pdb" />
</ItemGroup>
<Target Name="CopyUnityPlugins" AfterTargets="Build">
<Copy SourceFiles="@(BinaryFormats)" DestinationFolder="$(SolutionDir)Assets\Plugins" />
</Target>
</Project>
它的工作是将一些 class 库复制到 $(SolutionDir)Assets\Plugins
并以此实现。
但是有一点,每个要复制的文件路径都是硬编码的。
问题:
是否可以通过某种方式导入 .csproj 的宏并在文件中使用它们?
例如,能够使用以下语法而不是硬编码路径:
<ItemGroup>
<BinaryFormats Include="$(TargetDir)$(TargetName).dll"/>
<BinaryFormats Include="$(TargetDir)$(TargetName).pdb"/>
</ItemGroup>
是的,行得通。 Directory.build.props
和 Directory.build.targets
文件分别评估 对每个项目 分别执行。对于每个项目,相应的宏(例如 $(TargetPath)
或 $(ProjectPath)
)将具有该特定项目的值。所以你上面的例子 <BinaryFormats Include="$(TargetDir)$(TargetName).pdb"/>
应该像写的那样工作。
在附加条件下,您还可以使用这些文件有条件地扩展您的项目。例如,我有一个大型解决方案(100 多个项目),其中 Directory.build.props
包含以下部分:
<ItemGroup Condition="($(MSBuildProjectName.EndsWith('UnitTest')) OR $(MSBuildProjectName.EndsWith('IntegrationTest'))) AND '$(MSBuildProjectExtension)' == '.csproj'">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
</ItemGroup>
这会自动将这两个包添加为对所有单元测试项目(并且仅对这些项目)的引用,这不仅减少了项目文件本身的混乱,而且还允许我仅更改一行代码就可以升级这些包.