MSBuildプロジェクトファイルのProjectReferenceでプライベート設定は何をしますか?


120

先日、プロジェクトファイルでこれを確認しました。

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

内のすべてのノードはProjectReference自明であるように見えます(参照されるプロジェクトファイル、GUID、ソリューションエクスプローラーに表示する名前、および現在のプロジェクトが参照されるプロジェクトにリンクする必要があるかどうか)Private、および一般的なMSBuildプロジェクト項目ページは除きますtこの値を記録します。(ありますPrivateのための文書化の設定ReferenceではなくはProjectReference-それは持っているNeverAlwaysPreserveNewesttrueとfalseは、ない設定)

この設定は何をしますか?


2
MSBuildに関する限り、ProjectReferenceはアイテムグループ(つまり、リスト)であり、Privateは含まれているアイテムのアイテムメタデータです。あなたの質問への答えは、どんなインクルードがそれで何をするかにあります。より一般的に言えば、具体的なプロジェクトの種類は何ですか?質問にcsharpのタグを付けてください。
Tom Blodget、2014年

「インクルード」ではなく「インポート」を意味しました。
Tom Blodget、2014年

@malexander:元に戻す場合は、あなたの答えは良かったと思います...
Billy ONeal

2
@トム:確かに、厳密に言えばそれは本当です。一方、ProjectReferenceアイテムは(少なくとも)C#およびC ++ MSBuildサポートインフラストラクチャによって認識されます。主にMicrosoft.Common.CurrentVersion.targetsファイルで処理されているようです。
Billy ONeal 2014年

回答:


126

Privateタグは、Visual Studioの[参照設定]フォルダにある「ローカルコピー」チェックボックスにユーザーがオーバーライドを維持しています。これは、参照がGACから使用されるか、参照されるアセンブリをビルドディレクトリにコピーするかを制御します。

私はこの効果に関するMSDNドキュメントを見つけることができませんが(奇妙な驚き)、それは動作とそれが適用される場所のコメントからMicrosoft.Common.CurrentVersion.targets:1742明らかです。

これは、MSDN>一般的なMSBuildプロジェクトアイテムに記載されており、動作とそれが適用される場所のコメントからMicrosoft.Common.CurrentVersion.targets:1742明らかです。

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

                                        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
ミッチが言ったように、それは参照のプロパティのローカルのコピー設定を制御します。さらに、TrueとFalseの値のみを含めることができます。存在しない場合、デフォルト値のTrueが想定されます
GPR

4
がない場合は、<Private>と同等ではありませんTrue。「MSBuild CopyLocalバグ」を検索します。たとえば、stackoverflow.com
questions / 1132243を

7
@xmedeko、そうです。答えが「[Missing]はこのタスクがこの参照をCopyLocalとして扱うかどうかを決定することを意味する」と明示的に言っているため、@ GPRが「それがない場合はデフォルト値のTrueが想定されます」がどこで取得されたかわかりません。ロジックのほとんどが含まれていますmsbuild\Reference.cs:949
ミッチ

<Private>がに設定Trueされていても、アプリケーションで使用されていない場合、MSBuildは参照を出力に含めない可能性がありますか?これは私がローカルで取得している現在の動作です...
忍者

@Ninja、これは、MSBuildが参照されたアセンブリを見つけられない場合に最も頻繁に発生します。コードで直接使用されていない場合でも、正常にコンパイルされる可能性があります。procmonまたはMSBuildの詳細なログで
Mitch

0

私が述べたいのは、<Private>false</Private>ProjectReferencesに適用できる)を使用<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />してプロジェクトを$(MSBuildProjectFullPath)持っている場合に機能しない可能性がProjectReferenceあること<None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> です。https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targetsのソースコードを読み、解決策を見つけました。_GetChildProjectCopyToPublishDirectoryItems=false例を以下に示すように定義する必要があります。<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.