[提问]csproj 中的<Private>与<CopyLocal>究竟有什么区别

2022-01-17 16:27:48 +08:00
 natsukage

如题,一个 C#的 dll 项目(之前是.net framework 4.8 )中,通过 fody 打包引用的库。VS 为 2022 版,Fody 为 nuget 上的最新版。
默认情况下,设置引用的“复制本地”属性为 false 时,会自动在 csproj 中记录<Private>False</Private>,编译时就不会复制此文件,最后 Fody 生成的 dll 文件中也不会包含此引用的打包文件

<Reference Include="Example">
    <HintPath>..\Lib\Example.exe</HintPath>
    <Private>False</Private>
</Reference>

在将项目更改为.net standard 2.0 后(经测试,2.1 ,以及.net 5.0\6.0 均有同样问题),引用的右下角属性内的“复制本地”选项变为了影响 CopyLocal 项,例如我此时将这个文件改为“复制本地”,那么 csproj 中将会变成这样

<Reference Include="Example">
    <HintPath>..\Lib\Example.exe</HintPath>
    <Private>False</Private>
    <CopyLocal>True</CopyLocal>
</Reference>

问题来了,这样的配置下,在生成时并不会复制 Example.exe ,fody 也不会打包此文件。
即使去掉 Fody 的引用,最后生成文件时,也依然不会在生成目录里复制 Example.exe ,所以大概和 Fody 是没关系的。
反而如果手动更改<Private>为 True ,那么编译时将会正常复制并打包。

简单来说就是,VS 在编译时候似乎完全无视了<CopyLocal>,而只认<Private>。

查看微软的官方文档,VS2022 的 MSBuild 说明中只有 Private 元数据而没有 CopyLocal 。根据说明,Private 属性指示“指定是否应将引用复制到输出文件夹。 此特性与 Visual Studio IDE 中的引用的“复制本地”属性相匹配。”
从头到尾都没有提到过<CopyLocal>,根据生成时的表现来看,确实也只有<Private>设置的值有实际效果。

但是即使直接新建空白项目,引用文件并设置“复制本地”后,VS 修改的也只有 csproj 中的<CopyLocal>项而不是<Private>项。
在右侧的属性中任何选项都无法看到或修改当前 csproj 中<Private>的值。只能手动编辑 csproj 文件。

所以我现在非常迷糊,到底这个<CopyLocal>和<Private>是什么关系呢?我之前以为是升级换代的关系,但是即使我删掉了旧项目中的<Private>只保留<CopyLocal>,在编译项目时,文件复制依然会按照 Private 的默认值(true)执行文件复制与 Fody 打包,而完全无视了<CopyLocal>的值。彻底把我给整不会了

感谢各位大佬的解答(跪谢)

1566 次点击
所在节点    程序员
2 条回复
konar
2022-01-17 16:58:51 +08:00
似乎 CopyLocal 来自 VS 而 Private 来自 MSBuild
konar
2022-01-17 17:08:04 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/828802

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX