Что делает параметр Private для ProjectReference в файле проекта MSBuild?

120

На днях я видел это в файле проекта:

<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- но у него есть Never, Alwaysи PreserveNewestнастройки, а не истинные и ложные)

Что делает этот параметр?

Билли Онил
источник
2
Что касается MSBuild, ProjectReference - это группа элементов (т. Е. Список), а Private - это метаданные для включенного элемента. Ответ на ваш вопрос заключается в том, что с ним делать. В более общем плане, что это за конкретный тип проекта? Может быть, отметьте свой вопрос csharp.
Том Блоджет
Я имел в виду «Импорт», а не «включает».
Том Блоджет
@malexander: Я думаю, ваш ответ был хорош, если бы вы восстановили его ...
Билли Онил
2
@Tom: Конечно, строго говоря, это правда. С другой стороны, ProjectReferenceэлемент распознается (по крайней мере) поддерживающей инфраструктурой C # и C ++ MSBuild; похоже, что в основном это обрабатывается в Microsoft.Common.CurrentVersion.targetsфайле.
Билли Онил

Ответы:

126

PrivateТег поддерживает пользовательское переопределение флажка «Копировать Local» в папке Visual Studio Ссылки. Это определяет, используется ли ссылка из GAC или будет ли скопирована указанная сборка в каталог сборки.

Хотя я не могу найти никакой документации MSDN по этому поводу (удивление quelle), это очевидно из поведения и из комментария,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
Как сказал Митч, он управляет настройкой Copy Local в свойствах для справки. Кроме того, он может содержать только значения True и False. Если он отсутствует, то предполагается значение по умолчанию True
GPR
4
Если <Private>отсутствует, то он не эквивалентен True. Найдите «ошибку MSBuild CopyLocal». Например , см stackoverflow.com/questions/1132243
xmedeko
7
@xmedeko, Правильно. Я не уверен, откуда у @GPR: «Если он отсутствует, то предполагается значение по умолчанию True», поскольку в ответе явно говорится: «[Отсутствует] означает, что эта задача решит, рассматривать ли эту ссылку как CopyLocal или нет». Большая часть логики здесьmsbuild\Reference.cs:949
Митч
Возможно ли, что даже если <Private>установлено значение True, MSBuild по-прежнему не включает ссылку в выходные данные, если она не используется приложением? Это текущее поведение, которое я получаю локально ...
Ninja
@Ninja, это чаще всего происходит, если MSBuild не может найти сборку, на которую указывает ссылка. Если он не используется непосредственно кодом, он все равно может успешно компилироваться. Вы можете устранить неполадки с помощью procmon или подробного ведения журнала MSBuild
Митч
0

Я хочу просто заявить, что <Private>false</Private>(что вы можете применить к ProjectReferences) может не работать при использовании, <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />и у проекта $(MSBuildProjectFullPath)есть ProjectReferences, которые есть <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> . Я прочитал исходный код https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets и нашел решение. Вам необходимо определить, _GetChildProjectCopyToPublishDirectoryItems=falseнапример:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

Teroneko
источник