Co robi ustawienie prywatne w ProjectReference w pliku projektu MSBuild?

120

Widziałem to w pliku projektu pewnego dnia:

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

Każdy węzeł w a ProjectReferencewydaje się być oczywisty (plik projektu, do którego istnieje odwołanie, identyfikator GUID, nazwa do wyświetlenia w eksploratorze rozwiązań oraz to, czy bieżący projekt powinien łączyć się z projektem, do którego się odwołuje), z wyjątkiem Private, a strona Typowe elementy projektu MSBuild nie udokumentuj tę wartość. (Jest to Privateustawienie udokumentowane Referencezamiast ProjectReference- ale ma Never, Always, i PreserveNewestustawienia, nie prawdziwe i fałszywe)

Co robi to ustawienie?

Billy ONeal
źródło
2
W przypadku programu MSBuild ProjectReference to grupa elementów (tj. Lista), a Private to metadane elementu dla uwzględnionego elementu. Odpowiedź na twoje pytanie dotyczy tego, co z tym robi. Mówiąc bardziej ogólnie, jaki to konkretny rodzaj projektu? Może oznacz swoje pytanie tagiem csharp.
Tom Blodget
Miałem na myśli „Import”, a nie „obejmuje”.
Tom Blodget
@malexander: Myślę, że twoja odpowiedź była dobra, gdybyś ją
cofnął
2
@Tom: Jasne, ściśle mówiąc, to prawda. Z drugiej strony, ProjectReferenceelement jest rozpoznawany przez (przynajmniej) infrastrukturę wspierającą C # i C ++ MSBuild; wygląda na to, że jest obsługiwany głównie w Microsoft.Common.CurrentVersion.targetspliku.
Billy ONeal

Odpowiedzi:

126

PrivateTag utrzymuje obsługi nadpisanie do „Kopia lokalna” checkbox w folderze Visual Studio Referencje. To kontroluje, czy odwołanie jest używane z GAC, czy też skopiuje zestaw, do którego się odwołuje, do katalogu kompilacji.

Chociaż nie mogę znaleźć żadnej dokumentacji MSDN na ten temat (quelle niespodzianka), wynika to z zachowania i komentarza, wMicrosoft.Common.CurrentVersion.targets:1742 którym jest stosowany:

Jest to udokumentowane w MSDN> typowych elementach projektu MSBuild i jest widoczne na podstawie zachowania oraz komentarza, wMicrosoft.Common.CurrentVersion.targets:1742 którym jest stosowany:

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

                                        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.
    ============================================================
    -->
Mitch
źródło
7
Jak powiedział Mitch, kontroluje ustawienie Kopiuj lokalne we właściwościach dla odniesienia. Ponadto może zawierać tylko wartości True i False. Jeśli go nie ma, przyjmuje się domyślną wartość True
GPR
4
Jeśli <Private>brakuje, to nie jest równoważne True. Wyszukaj „MSBuild CopyLocal błąd”. Np. Patrz stackoverflow.com/questions/1132243
xmedeko
7
@xmedeko, zgadza się. Nie jestem pewien, gdzie @GPR otrzymało „Jeśli go nie ma, zakłada się domyślną wartość Prawda”, ponieważ odpowiedź wyraźnie mówi „[Brak] oznacza, że ​​to zadanie zadecyduje, czy traktować to odwołanie jako CopyLocal, czy nie”. Większość logiki jest już msbuild\Reference.cs:949
gotowa
Czy jest możliwe, że nawet jeśli <Private>jest ustawiona na True, MSBuild nadal nie zawiera odwołania w danych wyjściowych, jeśli nie jest używane przez aplikację? To jest obecne zachowanie, które otrzymuję lokalnie ...
Ninja,
@Ninja, dzieje się tak najczęściej, jeśli MSBuild nie może zlokalizować zestawu, do którego się odwołuje. Jeśli nie jest bezpośrednio używany przez kod, nadal może się pomyślnie skompilować. Możesz rozwiązywać problemy za pomocą szczegółowego rejestrowania
Mitch
0

Chcę tylko powiedzieć, że <Private>false</Private>(do których można zastosować ProjectReference) może nie działać podczas używania, <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />a projekt $(MSBuildProjectFullPath)ma takie, ProjectReferencektóre mają <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> . Przeczytałem kod źródłowy w okolicy https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets i znalazłem rozwiązanie. Musisz zdefiniować, _GetChildProjectCopyToPublishDirectoryItems=falsewięc przykładem będzie:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

Teroneko
źródło