V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
natsukage
V2EX  ›  程序员

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

  •  
  •   natsukage · 2022-01-17 16:27:48 +08:00 · 1563 次点击
    这是一个创建于 1042 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,一个 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>的值。彻底把我给整不会了

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

    2 条回复    2022-01-17 17:08:04 +08:00
    konar
        1
    konar  
       2022-01-17 16:58:51 +08:00
    似乎 CopyLocal 来自 VS 而 Private 来自 MSBuild
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2802 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:44 · PVG 19:44 · LAX 03:44 · JFK 06:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.