¿Qué hace la configuración privada en una referencia de proyecto en un archivo de proyecto de MSBuild?

120

Vi esto en un archivo de proyecto el otro día:

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

Cada nodo en un ProjectReferenceparece ser autoexplicativo (el archivo del proyecto al que se hace referencia, el GUID, el nombre que se muestra en el explorador de soluciones y si el proyecto actual debe vincularse al proyecto al que se hace referencia) excepto Private, y la página Elementos comunes del proyecto de MSBuild no lo hace. t documente este valor. (Hay una Privateconfiguración documentado para Referenceen lugar de ProjectReference- pero tiene Never, Alwaysy PreserveNewestlos ajustes, no verdaderos y falsos)

¿Qué hace esta configuración?

Billy ONeal
fuente
2
En lo que respecta a MSBuild, ProjectReference es un grupo de elementos (es decir, una lista) y Privado son los metadatos del elemento incluido. La respuesta a su pregunta radica en qué incluye cualquiera de ellos. En términos más generales, ¿qué tipo específico de proyecto es? Tal vez etiquete su pregunta con csharp.
Tom Blodget
Quise decir "Importaciones", no "incluye".
Tom Blodget
@malexander: Creo que tu respuesta fue buena si la recuperaste ...
Billy ONeal
2
@Tom: Claro, estrictamente hablando, eso es cierto. Por otro lado, el ProjectReferenceelemento es reconocido por (al menos) la infraestructura de soporte de C # y C ++ MSBuild; parece que se maneja principalmente en el Microsoft.Common.CurrentVersion.targetsarchivo.
Billy ONeal

Respuestas:

126

La Privateetiqueta mantiene la anulación del usuario en la casilla de verificación "Copiar local" en la carpeta Referencias de Visual Studio. Esto controla si la referencia se usa desde el GAC o si copiará el ensamblado al que se hace referencia en el directorio de compilación.

Si bien no puedo encontrar ninguna documentación de MSDN a este efecto (quelle sorpresa), es evidente por el comportamiento y por el comentarioMicrosoft.Common.CurrentVersion.targets:1742 donde se aplica:

Esto se documenta en MSDN> Elementos comunes del proyecto de MSBuild , y es evidente a partir del comportamiento y del comentario en el lugarMicrosoft.Common.CurrentVersion.targets:1742 donde se aplica:

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

                                        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
fuente
7
Como dijo Mitch, controla la configuración de Copiar local en las propiedades como referencia. Además, solo puede contener los valores Verdadero y Falso. Si está ausente, se asume el valor predeterminado de Verdadero
GPR
4
Si <Private>falta, no es equivalente a True. Busque "Error de CopyLocal de MSBuild". Por ejemplo, consulte stackoverflow.com/questions/1132243
xmedeko
7
@xmedeko, eso es correcto. No estoy seguro de dónde obtuvo @GPR "Si está ausente, se asume el valor predeterminado de Verdadero", ya que la respuesta dice explícitamente "[Falta] significa que esta tarea decidirá si tratar esta referencia como CopyLocal o no". La mayor parte de la lógica está enmsbuild\Reference.cs:949
Mitch
¿Es posible que incluso si <Private>está configurado en True, MSBuild todavía no incluye la referencia en la salida si no la utiliza la aplicación? Este es el comportamiento actual que estoy obteniendo localmente ...
Ninja
@Ninja, esto ocurre con mayor frecuencia si MSBuild no puede ubicar el ensamblado al que se hace referencia. Si el código no lo utiliza directamente, es posible que se compile correctamente. Puede solucionar problemas con procmon o registro detallado de MSBuild
Mitch
0

Solo quiero decir, que <Private>false</Private>(que puede aplicar a los ProjectReferences) puede no funcionar cuando se usan <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />y el proyecto $(MSBuildProjectFullPath)tiene ProjectReferences que tienen <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> . Leí el código fuente de https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets y encontré la solución. Necesita definir _GetChildProjectCopyToPublishDirectoryItems=falsepor lo que un ejemplo sería:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

Teroneko
fuente