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 प्रोजेक्ट आइटम पृष्ठ ' टी इस मूल्य दस्तावेज़। (वहाँ एक है Privateकी स्थापना के लिए दस्तावेज Referenceके बजाय ProjectReference- लेकिन यह है Never, Alwaysऔर PreserveNewestसेटिंग्स, सच्चे और झूठे नहीं)

यह सेटिंग क्या करती है?


2
जहां तक ​​MSBuild का संबंध है, ProjectReference एक आइटम समूह है (यानी, सूची) और निजी शामिल मद के लिए आइटम मेटाडेटा है। आपके प्रश्न का उत्तर इसमें शामिल है कि कोई भी इसके साथ क्या करता है। अधिक सामान्य शब्दों में, यह किस विशिष्ट प्रकार की परियोजना है? हो सकता है कि अपने प्रश्न को csharp के साथ टैग करें।
टॉम ब्लोडेट

मेरा मतलब था "आयात" में "शामिल नहीं" है।
टॉम ब्लोडेट

@ म्लेक्षैंडर: मुझे लगता है कि आपका उत्तर अच्छा था यदि आप इसे हटा देंगे ...
बिली ओनली

2
@ टॉम: यकीन है, कड़ाई से सच है कि बोल रहा हूँ। दूसरी ओर, ProjectReferenceआइटम को कम से कम (# कम से कम) C # और C ++ MSBuild समर्थन बुनियादी ढांचे द्वारा मान्यता प्राप्त है; ऐसा लगता है कि यह ज्यादातर Microsoft.Common.CurrentVersion.targetsफ़ाइल में संभाला है ।
बिली ओनेल

जवाबों:


126

Privateटैग दृश्य स्टूडियो संदर्भ फ़ोल्डर में "कॉपी स्थानीय" चेकबॉक्स को उपयोगकर्ता के ओवरराइड बनाए रखता है। यह नियंत्रित करता है कि संदर्भ 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 मान हो सकते हैं। यदि यह अनुपस्थित है तो ट्रू का डिफ़ॉल्ट मान मान लिया गया है
GPR

4
यदि <Private>गायब है, तो इसके बराबर नहीं है True। "MSBuild CopyLocal बग" के लिए खोजें। उदाहरण के लिए देखें stackoverflow.com/questions/1132243
xmedeko

7
@xmedeko, यह सही है। मुझे यकीन नहीं है कि जहां @GPR मिला "अगर यह अनुपस्थित है, तो True का डिफ़ॉल्ट मान" मान लिया गया है "क्योंकि उत्तर स्पष्ट रूप से कहता है" [लापता] का अर्थ है कि यह कार्य तय करेगा कि इस संदर्भ को CopyLocal के रूप में माना जाए या नहीं "। सबसे ज्यादा तर्क हैmsbuild\Reference.cs:949
मिच

क्या यह संभव है कि यहां तक ​​कि अगर <Private>सेट किया गया है True, तो MSBuild अभी भी आउटपुट में संदर्भ को शामिल नहीं करता है यदि इसका उपयोग एप्लिकेशन द्वारा नहीं किया गया है? यह वर्तमान व्यवहार है जो मुझे स्थानीय रूप से मिल रहा है ...
निंजा

@ निन्जा, यह सबसे अक्सर होता है यदि MSBuild संदर्भित विधानसभा का पता नहीं लगा सकता है। यदि यह सीधे कोड द्वारा उपयोग नहीं किया जाता है, तो यह अभी भी सफलतापूर्वक संकलित हो सकता है। आप procmon या MSBuild विस्तृत लॉगिंग के
मिच

0

मुझे लगता है कि सिर्फ राज्य करना चाहते हैं, <Private>false</Private>(जो आप पर लागू कर सकते ProjectReferenceरों) काम नहीं का उपयोग करते समय हो सकता है <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />और इस परियोजना $(MSBuildProjectFullPath)Have ProjectReferenceरों है <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> । मैंने https://github.com/dotnet/sdk/blob/master/src/T कार्य/Microsoft.NET.Build.Tasks/targets/ Microsoft.NET.Publish.targets के चारों ओर स्रोत कोड पढ़ा है और समाधान पाया है। आपको परिभाषित करने की आवश्यकता है _GetChildProjectCopyToPublishDirectoryItems=falseताकि एक उदाहरण होगा:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.