Que fait le paramètre Privé sur un ProjectReference dans un fichier de projet MSBuild?

120

J'ai vu cela dans un fichier de projet l'autre jour:

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

Chaque nœud dans un ProjectReferencesemble être explicite (le fichier de projet référencé, le GUID, le nom à afficher dans l'explorateur de solutions et si le projet actuel doit être lié au projet référencé) sauf Private, et la page Éléments de projet communs MSBuild ne le fait pas t documentez cette valeur. (Il y a un Privateparamètre documenté Referenceplutôt que ProjectReference- mais il a Never, Always, et les PreserveNewestparamètres, pas vrai et faux)

Que fait ce paramètre?

Billy ONeal
la source
2
En ce qui concerne MSBuild, ProjectReference est un groupe d'éléments (c'est-à-dire une liste) et Private est des métadonnées d'élément pour l'élément inclus. La réponse à votre question réside dans ce que tout inclut en faire. De manière plus générale, de quel type spécifique de projet s'agit-il? Peut-être étiqueter votre question avec csharp.
Tom Blodget
Je voulais dire "importations" et non "comprend".
Tom Blodget
@malexander: Je pense que votre réponse était bonne si vous la supprimiez ...
Billy ONeal
2
@Tom: Bien sûr, à proprement parler, c'est vrai. D'autre part, l' ProjectReferenceélément est reconnu par (au moins) l'infrastructure de prise en charge de C # et C ++ MSBuild; il semble qu'il est principalement géré dans le Microsoft.Common.CurrentVersion.targetsfichier.
Billy ONeal

Réponses:

126

La Privatebalise conserve le remplacement de l'utilisateur dans la case à cocher «Copier local» dans le dossier Références Visual Studio. Cela contrôle si la référence est utilisée à partir du GAC ou si elle copiera l'assembly référencé dans le répertoire de construction.

Bien que je ne trouve aucune documentation MSDN à cet effet (quelle surprise), cela ressort clairement du comportement et du commentaire dansMicrosoft.Common.CurrentVersion.targets:1742 lequel il est appliqué:

Ceci est documenté dans MSDN> Éléments de projet MSBuild communs , et est évident à partir du comportement et du commentaire dansMicrosoft.Common.CurrentVersion.targets:1742 lequel il est appliqué:

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

                                        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
la source
7
Comme Mitch l'a dit, il contrôle le paramètre Copier local dans les propriétés pour une référence. En outre, il ne peut contenir que les valeurs True et False. S'il est absent, la valeur par défaut de True est supposée
GPR
4
Si le <Private>est manquant, alors ce n'est pas équivalent à True. Recherchez "MSBuild CopyLocal bug". Par exemple, voir stackoverflow.com/questions/1132243
xmedeko
7
@xmedeko, c'est exact. Je ne sais pas où @GPR a obtenu "Si elle est absente, la valeur par défaut de True est supposée" puisque la réponse dit explicitement "[Manquant] signifie que cette tâche décidera de traiter cette référence comme CopyLocal ou non". La plupart de la logique est dansmsbuild\Reference.cs:949
Mitch
Est-il possible que même si <Private>est défini sur True, MSBuild n'inclut toujours pas la référence dans la sortie si elle n'est pas utilisée par l'application? C'est le comportement actuel que je reçois localement ...
Ninja
@Ninja, cela se produit le plus souvent si MSBuild ne parvient pas à localiser l'assembly référencé. S'il n'est pas directement utilisé par le code, il peut quand même se compiler correctement. Vous pouvez résoudre les problèmes avec la journalisation détaillée
Mitch
0

Je veux simplement dire que <Private>false</Private>(que vous pouvez appliquer à ProjectReferences) peut ne pas fonctionner lors de l' utilisation <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />et du projet $(MSBuildProjectFullPath)A des ProjectReferences qui ont <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> . J'ai lu le code source autour de https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets et j'ai trouvé la solution. Vous devez définir _GetChildProjectCopyToPublishDirectoryItems=falseun exemple serait:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

Teroneko
la source