Що робить приватне налаштування для 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файлі.
Біллі ONeal

Відповіді:


126

PrivateТег підтримує призначене для користувача перевизначення прапорця «Копіювати Local» в папці 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
Як сказав Мітч, він керує налаштуваннями "Копіювати локально" у властивостях для довідки. Крім того, він може містити лише значення 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 докладні протоколювання
Mitch

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" />

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.