私有设置对MSBuild项目文件中的ProjectReference有什么作用?


119

前几天我在项目文件中看到了这一点:

<ProjectReference Include="Foo\Bar\Baz.csproj">
    <Project>{A GUID HERE}</Project>
    <Name>Baz</Name>
    <Private>False</Private> <!-- ??? -->
    <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
</ProjectReference>

ProjectReference除了中的每个节点,它们似乎都是自我解释的(引用的项目文件,GUID,在解决方案资源管理器中显示的名称以及当前项目是否应链接到引用的项目)Private,而“ 公共MSBuild项目项”页面则没有。 t记录此值。(有一个Private文件化的设置Reference,而不是ProjectReference-但它有NeverAlwaysPreserveNewest设置,而不是真假)

此设置有什么作用?


2
就MSBuild而言,ProjectReference是项目组(即列表),而Private是所包含项目的项目元数据。您的问题的答案在于任何包含它的内容。概括地说,这是什么类型的项目?也许用csharp标记您的问题。
汤姆·布洛杰特

我的意思是“导入”而不是“包含”。
Tom Blodget 2014年

@malexander:如果您不删除它,我认为您的回答很好……
Billy ONeal 2014年

2
@汤姆:当然,严格来说是真的。另一方面,ProjectReference(至少)C#和C ++ MSBuild支持基础结构可以识别该项目。看起来大部分是在Microsoft.Common.CurrentVersion.targets文件中处理的。
Billy ONeal 2014年

Answers:


126

Private标签维护用户覆盖在Visual Studio中引用文件夹中的“复制本地”复选框。这可以控制是从GAC使用引用,还是将引用的程序集复制到构建目录。

虽然我无法找到任何MSDN文档这种效果(广利惊喜),这是显而易见的行为,并从评论Microsoft.Common.CurrentVersion.targets:1742应用位置:

MSDN>常见MSBuild项目项中对此进行了记录Microsoft.Common.CurrentVersion.targets:1742,从行为和应用注释中可以明显看出这一点:

  <!--
    ============================================================

                                        ResolveAssemblyReferences

    Given the list of assemblies, find the closure of all assemblies that they depend on. These are
    what we need to copy to the output directory.

        [IN]
        @(Reference) - List of assembly references as fusion names.
        @(_ResolvedProjectReferencePaths) - List of project references produced by projects that this project depends on.

            The 'Private' attribute on the reference corresponds to the Copy Local flag in IDE.
            The 'Private' flag can have three possible values:
                - 'True' means the reference should be Copied Local
                - 'False' means the reference should not be Copied Local
                - [Missing] means this task will decide whether to treat this reference as CopyLocal or not.

        [OUT]
        @(ReferencePath) - Paths to resolved primary files.
        @(ReferenceDependencyPaths) - Paths to resolved dependency files.
        @(_ReferenceRelatedPaths) - Paths to .xmls and .pdbs.
        @(ReferenceSatellitePaths) - Paths to satellites.
        @(_ReferenceSerializationAssemblyPaths) - Paths to XML serialization assemblies created by sgen.
        @(_ReferenceScatterPaths) - Paths to scatter files.
        @(ReferenceCopyLocalPaths) - Paths to files that should be copied to the local directory.
    ============================================================
    -->

7
正如Mitch所说,它控制属性中的“本地复制”设置以供参考。此外,它只能包含值True和False。如果不存在,则采用默认值True
GPR

4
如果<Private>缺少,则不等于True。搜索“ MSBuild CopyLocal错误”。例如,请参见stackoverflow.com/questions/1132243
xmedeko

7
@xmedeko,是的。我不确定@GPR在哪里得到“如果不存在,则采用默认值True”,因为答案明确指出“ [缺少]意味着此任务将决定是否将此引用视为CopyLocal”。大部分逻辑都在其中msbuild\Reference.cs:949
米奇

如果<Private>TrueMSBuild 设置为,则如果应用程序未使用该引用,则MSBuild是否仍不将引用包含在输出中?这是我在本地得到的当前行为...
Ninja

@Ninja,如果MSBuild无法找到引用的程序集,则最常发生这种情况。如果代码未直接使用它,则它仍可能成功编译。您可以排除将procmonMSBuild的详细的日志
米奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.