Cosa fa l'impostazione Private su un ProjectReference in un file di progetto MSBuild?


120

L'ho visto in un file di progetto l'altro giorno:

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

Ogni nodo in a ProjectReferencesembra essere autoesplicativo (il file di progetto di riferimento, il GUID, il nome da mostrare in Esplora soluzioni e se il progetto corrente deve collegarsi o meno al progetto di riferimento) tranne Privatee la pagina Elementi comuni del progetto MSBuild non lo fa ' documentare questo valore. (C'è un Privateambiente documentata per Referencepiuttosto che ProjectReference- ma ha Never, Alwayse PreserveNewestle impostazioni, non vere e false)

Cosa fa questa impostazione?


2
Per quanto riguarda MSBuild, ProjectReference è un gruppo di elementi (ad esempio, elenco) e Privato sono i metadati degli elementi per l'elemento incluso. La risposta alla tua domanda sta in ciò che qualsiasi include farne. In termini più generali, che tipo specifico di progetto è? Forse tagga la tua domanda con csharp.
Tom Blodget

Intendevo "Importazioni" non "include".
Tom Blodget

@malexander: Penso che la tua risposta fosse buona se avessi annullato l'eliminazione ...
Billy ONeal

2
@ Tom: certo, a rigor di termini è vero. D'altra parte, l' ProjectReferenceelemento è riconosciuto da (almeno) l'infrastruttura di supporto di MSBuild C # e C ++; sembra che sia gestito principalmente nel Microsoft.Common.CurrentVersion.targetsfile.
Billy ONeal

Risposte:


126

Il Privatetag mantiene l'override dell'utente alla casella di controllo "Copia locale" nella cartella Riferimenti di Visual Studio. Controlla se il riferimento viene utilizzato dalla GAC ​​o se copierà l'assembly a cui si fa riferimento nella directory di compilazione.

Anche se non riesco a trovare alcuna documentazione MSDN in tal senso (quelle sorpresa), è evidente dal comportamento e dal commento inMicrosoft.Common.CurrentVersion.targets:1742 cui viene applicata:

Ciò è documentato in MSDN> Elementi comuni del progetto MSBuild ed è evidente dal comportamento e dal commento inMicrosoft.Common.CurrentVersion.targets:1742 cui viene applicato:

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

                                        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
Come ha detto Mitch, controlla l'impostazione Copia locale nelle proprietà come riferimento. Inoltre, può contenere solo i valori True e False. Se è assente, si assume il valore predefinito True
GPR

4
Se <Private>manca, non è equivalente a True. Cerca "MSBuild CopyLocal bug". Ad esempio, vedere stackoverflow.com/questions/1132243
xmedeko

7
@xmedeko, è corretto. Non sono sicuro di dove ha ottenuto @GPR "Se è assente, viene assunto il valore predefinito di True" poiché la risposta dice esplicitamente "[Mancante] significa che questa attività deciderà se trattare questo riferimento come CopyLocal o meno". La maggior parte della logica è inmsbuild\Reference.cs:949
Mitch

È possibile che, anche se <Private>impostato su True, MSBuild non includa ancora il riferimento nell'output se non è utilizzato dall'applicazione? Questo è il comportamento attuale che ottengo localmente ...
Ninja

@ Ninja, questo accade più di frequente se MSBuild non riesce a individuare l'assembly a cui si fa riferimento. Se non viene utilizzato direttamente dal codice, potrebbe comunque essere compilato correttamente. Puoi risolvere i problemi con la registrazione dettagliata di procmon o MSBuild
Mitch

0

Voglio solo affermare che <Private>false</Private>(che puoi applicare a ProjectReferences) potrebbe non funzionare quando usi <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />e progetti $(MSBuildProjectFullPath)hanno ProjectReferences che hanno <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> . Ho letto il codice sorgente su https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets e ho trovato la soluzione. È necessario definire in _GetChildProjectCopyToPublishDirectoryItems=falsemodo che un esempio sarebbe:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.