将 .csproj 的宏导入 Directory.build.targets 文件?

Posted

技术标签:

【中文标题】将 .csproj 的宏导入 Directory.build.targets 文件?【英文标题】:Importing macros of a .csproj to a Directory.build.targets file? 【发布时间】:2021-11-27 15:05:34 【问题描述】:

我在解决方案文件旁边有以下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>

它的工作是将一些类库复制到$(SolutionDir)Assets\Plugins并实现。

但是,要复制的每个文件路径都是硬编码的。

问题:

是否有可能以某种方式导入 .csproj 的宏并在文件中使用它们?

例如,能够使用以下语法而不是硬编码路径:

<ItemGroup>
    <BinaryFormats Include="$(TargetDir)$(TargetName).dll"/>
    <BinaryFormats Include="$(TargetDir)$(TargetName).pdb"/>
</ItemGroup>

【问题讨论】:

对于$(SolutionDir),您已经在使用宏,那么为什么不能直接开箱即用呢?有可能有些不可用,但我很确定 $(TargetDir) 例如是。 你是说我应该编辑并把这样的文件放在 Projects\BinaryFormats 目录中吗?问题是,我想应用好莱坞原则“不要打电话给我们,我们会打电话给你。”,即不为外部消费定制 BinaryFormats。 那我可能误解了你的问题。您想对解决方案中的所有项目执行上述操作吗?您的实际 .targets 文件是否包含许多与上述类似的部分? @PMF 这真的很有趣,我已经使用$(TargetDir)$(TargetName)... 将内容更改为通用内容,并且有效地适用于多个项目,它们的每个输出都被复制:) 注意 Directory.build.props 的评估很早,因此某些属性可能不可用,但这两个是可用的。附加说明:使用它以“永久”方式修改构建并不总是最好的主意(例如:将文件包含在版本控制中),因为这使得以它预期的方式自定义构建变得更加困难。另一种方法是只拥有另一个文件并将其导入每个需要它的项目中。 【参考方案1】:

是的,这行得通。 Directory.build.propsDirectory.build.targets 文件分别评估分别执行每个项目。对于每个项目,相应的宏(例如$(TargetPath)$(ProjectPath))将具有该特定项目的值。所以你上面的例子&lt;BinaryFormats Include="$(TargetDir)$(TargetName).pdb"/&gt; 应该像写的那样工作。

通过附加条件,您还可以使用这些文件有条件地扩展您的项目。例如,我有一个大型解决方案(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>

这会自动将这两个包添加为对所有单元测试项目(并且仅限于这些)的引用,这不仅减少了项目文件本身的混乱,还允许我只更改一行代码即可升级这些包。

【讨论】:

以上是关于将 .csproj 的宏导入 Directory.build.targets 文件?的主要内容,如果未能解决你的问题,请参考以下文章

错误:*.csproj 无法在 MonoDevelop 上导入“$(MSBuildBinPath)\Microsoft.CSharp.targets”

将用户从 CSV/Excel 导入 Active Directory

如何将Active Directory ldif文件导入openldap服务器?

Access中的宏在导入文件时提示输入文件路径

VS2017 Directory.Build.props 不加载整个解决方案

我可以将这个旧的 csproj 迁移到 VS2017 csproj 吗?