Apa yang dilakukan pengaturan pribadi pada ProjectReference di file proyek MSBuild?

120

Saya melihat ini di file proyek beberapa hari yang lalu:

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

Setiap node di a ProjectReferencetampaknya cukup jelas (file proyek yang direferensikan, GUID, nama yang akan ditampilkan di explorer solusi, dan apakah proyek saat ini harus ditautkan ke proyek yang dirujuk) kecuali Private, dan halaman Common MSBuild Project Items tidak t mendokumentasikan nilai ini. (Ada Privatepengaturan terdokumentasi untuk Referencedaripada ProjectReference- tetapi memiliki Never, Always, dan PreserveNewestpengaturan, tidak benar dan yang salah)

Apa fungsi pengaturan ini?

Billy ONeal
sumber
2
Sejauh menyangkut MSBuild, ProjectReference adalah grup item (yaitu, daftar) dan Private adalah metadata item untuk item yang disertakan. Jawaban atas pertanyaan Anda terletak pada apa saja yang termasuk hubungannya dengan itu. Dalam istilah yang lebih umum, jenis proyek apa itu? Mungkin tandai pertanyaan Anda dengan csharp.
Tom Blodget
Maksud saya "Impor" bukan "termasuk".
Tom Blodget
@malexander: Saya pikir jawaban Anda bagus jika Anda membatalkan penghapusan ...
Billy ONeal
2
@ Tom: Tentu, secara tegas itu benar. Di sisi lain, ProjectReferenceitem tersebut dikenali oleh (setidaknya) infrastruktur pendukung C # dan C ++ MSBuild; sepertinya sebagian besar ditangani dalam Microsoft.Common.CurrentVersion.targetsfile.
Billy ONeal

Jawaban:

126

The Privatetag mempertahankan user-override ke "Salin Lokal" kotak centang di folder Referensi Visual Studio. Ini mengontrol apakah referensi digunakan dari GAC atau apakah akan menyalin rakitan yang direferensikan ke direktori build.

Meskipun saya tidak dapat menemukan dokumentasi MSDN untuk efek ini (kejutan quelle), itu terbukti dari perilaku dan dari komentar diMicrosoft.Common.CurrentVersion.targets:1742 mana itu diterapkan:

Ini didokumentasikan di MSDN> Item proyek MSBuild umum , dan terbukti dari perilaku dan dari komentar diMicrosoft.Common.CurrentVersion.targets:1742 mana itu diterapkan:

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

                                        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
sumber
7
Seperti kata Mitch itu mengontrol pengaturan Salin Lokal di properti untuk referensi. Selain itu, ini hanya dapat berisi nilai True dan False. Jika tidak ada maka nilai default True diasumsikan
GPR
4
Jika <Private>hilang, maka itu tidak sama dengan True. Cari "bug CopyLocal MSBuild". Misalnya, lihat stackoverflow.com/questions/1132243
xmedeko
7
@xmedeko, Itu benar. Saya tidak yakin di mana @GPR mendapatkan "Jika tidak ada maka nilai default True diasumsikan" karena jawabannya secara eksplisit mengatakan "[Hilang] berarti tugas ini akan memutuskan apakah akan memperlakukan referensi ini sebagai CopyLocal atau tidak". Sebagian besar logikanya ada dimsbuild\Reference.cs:949
Mitch
Apakah mungkin bahkan jika <Private>diatur ke True, MSBuild masih tidak menyertakan referensi dalam Output jika tidak digunakan oleh aplikasi? Ini adalah perilaku saat ini yang saya dapatkan secara lokal ...
Ninja
@Ninja, ini paling sering terjadi jika MSBuild tidak dapat menemukan rakitan yang dirujuk. Jika tidak langsung digunakan oleh kode, mungkin masih berhasil dikompilasi. Anda dapat memecahkan masalah dengan log detail procmon atau MSBuild
Mitch
0

Saya hanya ingin negara, yang <Private>false</Private>(yang dapat Anda terapkan untuk ProjectReferences) tidak bekerja mungkin ketika menggunakan <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />dan proyek $(MSBuildProjectFullPath)Memiliki ProjectReferences yang memiliki <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> . Saya telah membaca kode sumber di sekitar https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/t Target /Microsoft.NET.Publish.t target dan menemukan solusinya. Anda perlu mendefinisikan _GetChildProjectCopyToPublishDirectoryItems=falsesehingga contohnya adalah:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

Teroneko
sumber