【发布时间】: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 的评估很早,因此某些属性可能不可用,但这两个是可用的。附加说明:使用它以“永久”方式修改构建并不总是最好的主意(例如:将文件包含在版本控制中),因为这使得以它预期的方式自定义构建变得更加困难。另一种方法是只拥有另一个文件并将其导入每个需要它的项目中。
标签: c# visual-studio unity3d msbuild