TL;DR

ContentWithTargetPath实际上只是<Content ..><TargetPath>..的内部MSBuild表示,还是这真的是一个"适当的"MSBuild配置项?


只有一个(1!)我们的几百个项目中包含一个条目

<ContentWithTargetPath Include="..\x-model\v6\stuff.json"> 
  <Link>data\stuff.json</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  <TargetPath>stuff.json</TargetPath>
</ContentWithTargetPath>

我试着找到any个文档,但虽然在S.O.上提到了many times个.在这里,似乎没有此MSBuild项的any文档.

我进一步发现在GitHub的一个第https://github.com/dotnet/msbuild/issues/2795期中提到了ContentWithTargetPath_NoneWithTargetPath.

我还为<Content ...>列出了TargetPath可选子条目的Common MSBuild project items reference(但是为<None ...>列出了not,尽管似乎没有人支持它).

此外,据我所知,无论我在实际的csproj文件中使用NoneContent还是ContentWithTargetPath作为元素,<TargetPath>CopyToOutputDirectory的行为都完全相同.

谁能解释一下,为什么我可以在S.O.上找到50多个MSBuild属性的条目,但在MSBuild的MS文档中没有记录,甚至在任何DotNet GitHub问题上都没有显著记录?此配置项是否有任何历史记录?

推荐答案

在您的项目文件中使用Content,当您需要运行自定义构建逻辑作为构建的一部分,并且在AssignTargetPaths目标之后执行,并且您错过了Content项被拾取的机会时,请使用ContentWithTargetPath.


遗憾的是,构建过程中的许多部分没有完整的文档记录,只能通过查看MSBuild/.NET SDK中附带必要逻辑的实际"代码"来理解.

至于ContentWithTargetPath,它没有下划线作为前缀,因此可以预计,人们将尽量不对创建或使用它的代码进行 destruct 性更改.

在内部,在构建过程中计算ContentWithTargetPath个项,因为在默认情况下Content不需要包含TargetPathLink元数据,因此有一个步骤来创建构建过程中后面的步骤可以依赖的中间项,因此不需要实现其他逻辑(复制到输出/发布)来自己实现计算目标路径,并且存在依赖于这ContentWithTargetPath个项上存在的TargetPath个元数据的共享逻辑.

记录ContentWithTargetPath没有太大用处,因为在创作项目时,您可以使用Content项实现大多数事情,而且通常只有高级构建定制需要了解构建过程的更多内部部分(对于这些部分,您无论如何都必须阅读内置逻辑).这也意味着,当人们只使用Content工具(例如,不同的IDE)时,需要专注于理解更少的项,而不是试图聪明地决定何时使用哪些工具.

有一点需要注意的是,在从Content个项创建ContentWithTargetPath个项之后,在该步骤(AssignTargetPaths个目标)之后运行的构建逻辑必须创建ContentWithTargetPath个项,如果他们想要贡献需要复制/发布的项.例如,如果您希望将向发布输出添加附加项但不需要在dotnet build上运行的逻辑挂钩到dotnet publish中,则可能会出现这种情况.

Csharp相关问答推荐

总是丢弃返回的任务和使方法puc无效之间有区别吗?

需要深入了解NpgSQL DateTimeOffset处理

Entity Framework Core 8 dbcontext—无法以多对多关系添加某些行'

. NET在上一个操作完成之前,在此上下文实例上启动了第二个操作

在C#WinUI中,一个关于System的崩溃."由于未知原因导致执行不例外"

应用程序启动器,可 Select 物理屏幕

只有第一个LINQ.Count()语句有效

如何在页面重新加载后保持菜单切换状态

Unix上的.NET(核心):.NET意外地未看到通过P/Invoke系统调用对环境变量进行的进程内修改

使用泛型可空类实现接口

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

如何使用.NET6WPF打印车票?

.NET:从XPath定位原始XML文档中的 node

对于PowerShell中的ConvertTo-SecureString方法,Microsoft如何将初始化向量添加到AES加密中的安全字符串?

使用switch 类型模式时出现奇怪的编译器行为

如何返回具有泛型的类?

如何阻止可传递依赖项出现在项目中

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

SignalR跨域

System.Net.Http.HttpClient返回错误&Quot;Err:缺少UA30&Quot;