Özel ayarı, MSBuild proje dosyasındaki ProjectReference öğesinde ne yapar?


120

Bunu geçen gün bir proje dosyasında gördüm:

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

A'daki her düğüm ProjectReferencekendi kendini açıklayıcı (başvurulan proje dosyası, GUID, çözüm gezgininde gösterilecek ad ve mevcut projenin başvurulan projeye bağlanması gerekip gerekmediği) Privateve Common MSBuild Proje Öğeleri sayfası dışında görünür. t bu değeri belgeleyin. (Orada bir var Privateiçin belgelenmiş ayar Referenceyerine ProjectReference- ama sahiptir Never, Alwaysve PreserveNewestdoğru ve yanlış değil ayarlar)

Bu ayar ne işe yarar?


2
MSBuild söz konusu olduğunda, ProjectReference bir öğe grubudur (yani liste) ve Özel, dahil edilen öğe için öğe meta verileridir. Sorunuzun cevabı, herhangi birinin onunla ne ilgisi olduğuna bağlıdır. Daha genel bir ifadeyle, bu ne tür bir proje? Sorunuzu csharp ile etiketleyebilirsiniz.
Tom Blodget

"İçerir" değil "İthalatlar" demek istedim.
Tom Blodget

@malexander: Silmeyi geri alırsanız cevabınızın iyi olacağını düşünüyorum ...
Billy ONeal

2
@Tom: Elbette, bu kesinlikle doğru. Öte yandan, ProjectReferenceöğe (en azından) C # ve C ++ MSBuild destekli altyapı tarafından tanınır; Çoğunlukla Microsoft.Common.CurrentVersion.targetsdosyada ele alınmış gibi görünüyor .
Billy ONeal

Yanıtlar:


126

PrivateEtiketi Visual Studio Başvurular klasöründe "Kopya yerel" onay kutusunun kullanıcı geçersiz kılma tutar. Bu, başvurunun GAC'den kullanılıp kullanılmayacağını veya başvurulan derlemeyi derleme dizinine kopyalayıp kopyalayamayacağını denetler.

Bu etkinin (ne sürpriz) herhangi MSDN belgelerine bulamıyorum birlikte, davranışlardan ve bellidir yorumun danMicrosoft.Common.CurrentVersion.targets:1742 uygulandığı anlaşılıyor:

Bu, MSDN> Ortak MSBuild proje öğelerinde belgelenmiştir ve davranıştan ve uygulandığı yorumdanMicrosoft.Common.CurrentVersion.targets:1742 anlaşılır:

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

                                        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
Mitch'in dediği gibi, bir referans için özelliklerdeki Yerel Kopyala ayarını kontrol eder. Ek olarak, yalnızca True ve False değerlerini içerebilir. Eğer yoksa, varsayılan True değeri varsayılır
GPR

4
Eğer <Private>eksik, o zaman eşdeğer değildir True. "MSBuild CopyLocal bug" ı arayın. Örneğin stackoverflow.com/questions/1132243
xmedeko

7
@xmedeko, Bu doğru. @GPR'nin nereden geldiğinden emin değilim "Eğer yoksa o zaman True varsayılan değeri varsayılır" çünkü cevap açıkça "[Eksik] bu görevin bu referansın CopyLocal olarak değerlendirilip değerlendirilmeyeceğine karar vereceği anlamına gelir". Mantığın çoğu yerindemsbuild\Reference.cs:949
Mitch

MSBuild <Private>olarak ayarlanmış olsa bile True, uygulama tarafından kullanılmıyorsa, MSBuild başvuruyu Çıktı'ya eklemiyor olabilir mi? Bu, yerel olarak aldığım şu anki davranış ...
Ninja

@Ninja, bu en sık MSBuild başvurulan derlemeyi bulamazsa gerçekleşir. Doğrudan kod tarafından kullanılmıyorsa, yine de başarıyla derlenebilir. Procmon veya MSBuild ayrıntılı günlük kaydı
Mitch

0

Bunu, sadece devlete istiyorum <Private>false</Private>(başvurabileceğiniz hangi ProjectReferences) kullanmayan işin duruma geldiğinde <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />ve proje $(MSBuildProjectFullPath)Var ProjectReferencelar buna sahip <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> . Https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets çevresindeki kaynak kodunu okudum ve çözümü buldum. _GetChildProjectCopyToPublishDirectoryItems=falseBir örnek şöyle tanımlamanız gerekir:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.