Was bewirkt die Einstellung "Privat" für eine ProjectReference in einer MSBuild-Projektdatei?

119

Ich habe das neulich in einer Projektdatei gesehen:

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

Jeder Knoten in a ProjectReferencescheint selbsterklärend zu sein (die referenzierte Projektdatei, die GUID, der Name, der im Lösungs-Explorer angezeigt werden soll, und ob das aktuelle Projekt mit dem referenzierten Projekt verknüpft werden soll oder nicht), außer Privateund die Seite " Allgemeine MSBuild-Projektelemente " nicht. t diesen Wert dokumentieren. (Es gibt eine PrivateEinstellung für dokumentiert und Referencenicht ProjectReference- aber es hat Never, Alwaysund PreserveNewestEinstellungen, nicht wahr und falsch)

Was macht diese Einstellung?

Billy ONeal
quelle
2
Für MSBuild ist ProjectReference eine Elementgruppe (dh Liste) und Private sind Elementmetadaten für das enthaltene Element. Die Antwort auf Ihre Frage liegt darin, was alle Includes damit machen. Um welche Art von Projekt handelt es sich allgemeiner? Vielleicht kennzeichnen Sie Ihre Frage mit csharp.
Tom Blodget
Ich meinte "Importe" nicht "enthält".
Tom Blodget
@malexander: Ich denke, Ihre Antwort war gut, wenn Sie es wiederherstellen würden ...
Billy ONeal
2
@ Tom: Sicher, genau genommen stimmt das. Andererseits wird das ProjectReferenceElement (zumindest) von der C # - und C ++ - MSBuild-unterstützenden Infrastruktur erkannt. es sieht so aus, als würde es hauptsächlich in der Microsoft.Common.CurrentVersion.targetsDatei behandelt.
Billy ONeal

Antworten:

126

Das PrivateTag behält die Benutzerüberschreibung für das Kontrollkästchen "Lokal kopieren" im Ordner "Visual Studio-Referenzen" bei. Hiermit wird gesteuert, ob die Referenz vom GAC verwendet wird oder ob die referenzierte Assembly in das Build-Verzeichnis kopiert wird.

Ich kann zwar keine MSDN-Dokumentation zu diesem Zweck finden (quelle überraschend), aber dies geht aus dem Verhalten und dem Kommentar hervor, inMicrosoft.Common.CurrentVersion.targets:1742 dem sie angewendet wird:

Dies ist in MSDN> Allgemeine MSBuild-Projektelemente dokumentiert und geht aus dem Verhalten und dem Kommentar hervor, inMicrosoft.Common.CurrentVersion.targets:1742 dem es angewendet wird:

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

                                        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
quelle
7
Wie Mitch sagte, steuert es die Einstellung "Lokal kopieren" in den Eigenschaften als Referenz. Außerdem kann es nur die Werte True und False enthalten. Wenn es nicht vorhanden ist, wird der Standardwert von True angenommen
GPR
4
Wenn das <Private>fehlt, ist es nicht gleichbedeutend mit True. Suchen Sie nach "MSBuild CopyLocal Bug". Siehe zum Beispiel stackoverflow.com/questions/1132243
xmedeko
7
@ xmedeko, das stimmt. Ich bin nicht sicher, wo @GPR "Wenn es fehlt, wird der Standardwert von True angenommen" erhalten hat, da in der Antwort explizit "[Missing]" steht, bedeutet diese Aufgabe, ob diese Referenz als CopyLocal behandelt wird oder nicht. Der größte Teil der Logik ist inmsbuild\Reference.cs:949
Mitch
Ist es möglich , dass , selbst wenn <Private>gesetzt wird True, MSBuild noch nicht die Referenz in der Ausgabe nicht enthalten , wenn sie nicht von der Anwendung verwendet? Dies ist das aktuelle Verhalten, das ich vor Ort bekomme ...
Ninja
@ Ninja, dies geschieht am häufigsten, wenn MSBuild die referenzierte Assembly nicht finden kann. Wenn es nicht direkt vom Code verwendet wird, kann es dennoch erfolgreich kompiliert werden. Sie können mit Procmon oder MSBuild detaillierte Protokollierung
Mitch