डॉटनेट क्लि और नए बनाम2017 एमएसबिल्ट के बीच संबंध


88

VS2017 के साथ पेश किए project.jsonगए नए csprojप्रारूप के कदम के साथ, मैं क्ली dotnetऔर नए के बीच अंतर को समझने के लिए संघर्ष कर रहा हूं msbuildऔर जब एक दूसरे पर उपयोग करना है।

1) csprojकमांड लाइन से एक नई netstandard लाइब्रेरी बनाने के लिए , क्या मुझे क्ली dotnet(उदाहरण के लिए dotnet restore dotnet build) या उपयोग msbuild( उदाहरण के लिए ) कॉल करना चाहिए msbuild ExampleNetstandard.sln

2) इसके अलावा, मेरी समझ यह है कि इसके दो संस्करण हैं msbuild, एक पूर्ण रूपरेखा और दूसरा लक्ष्यीकरण dotnet core। क्या ये सही है? क्या मुझे हमेशा उपयोग करना चाहिएdotnet version

3) dotnet cliस्टैंडअलोन है या इसे msbuildस्थापित करने की आवश्यकता है? उदाहरण के लिए जब आप डॉटनेट एसडीके को स्थापित करते हैं तो क्या यह एमएसबिल्ट को भी स्थापित करता है? यदि ऐसा है तो यह उस संस्करण से भिन्न है जिसे vs2017 के साथ स्थापित किया गया है?

जवाबों:


148

प्रशन

1) कमांड लाइन से एक नई csproj netstandard लाइब्रेरी बनाने के लिए, क्या मुझे डॉटनेट क्ली (उदाहरण के लिए डॉटनेट रिस्टोर डॉटनेट बिल्ड) का उपयोग करना चाहिए या msbuild (उदाहरण के लिए msbuild exampleNetstandard.sln) का उपयोग करना चाहिए।

दोनों ठीक करते हैं क्योंकि वर्तमान dotnetमें शीर्ष पर बनाया गया है msbuild। तो यह स्वाद की बात है। आप डॉटनेट CLI का उपयोग करके भी msbuild कार्य कह सकते हैं। ( dotnet msbuild <msbuild_arguments>)

शुरुआत में, सभी .NET कोर सामान केवल में dotnetऔर अंदर नहीं था msbuild। यह बहुत सारे सामान के रूप में बोझिल था जो पहले से ही निर्मित msbuildथा dotnet, बॉक्स से बाहर काम नहीं कर रहा था (उदाहरण के लिए ज़मारिन)। इसलिए वे सामान को ऊपर ले गए msbuildऔर उसके dotnetऊपर निर्माण किया msbuild

dotnetकुछ विशेषताएं हैं जो अंदर नहीं हैं msbuild, जैसे dotnet new। मेरी राय में, dotnetका उपयोग करना आसान है msbuild, इसलिए मैं पसंद करता हूं dotnet

इसे और अधिक स्पष्ट करने के लिए, मैंने अपनी पोस्ट के अंत में msbuildऔर उसके बीच एक तुलना जोड़ी है dotnet

2) इसके अलावा, मेरी समझ यह है कि msbuild के दो संस्करण हैं, एक पूर्ण फ्रेमवर्क पर बनाया गया है और दूसरा लक्ष्य डॉटनेट कोर है। क्या ये सही है? क्या मुझे हमेशा डॉटनेट संस्करण का उपयोग करना चाहिए

केवल एक msbuild है। डॉटनेट CLI msbuild का उपयोग कर रहा है:

चूंकि CLI MSBuild को इसके निर्माण इंजन के रूप में उपयोग करता है, इसलिए हम अनुशंसा करते हैं कि टूल के इन हिस्सों को कस्टम MSBuild लक्ष्य और कार्यों के रूप में लिखा जाए, क्योंकि वे तब समग्र निर्माण प्रक्रिया में भाग ले सकते हैं

https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility

पुराने संस्करण में msbuild.NET कोर सपोर्ट की कमी थी। शायद वह दूसरा संस्करण है;)

मैं मानता हूं कि यह भ्रामक है, क्योंकि यह कुछ महीने पहले बहुत अलग था।

3) क्या डॉटनेट क्लि स्टैंडअलोन है या क्या इसे स्थापित करने के लिए msbuild की आवश्यकता है? उदाहरण के लिए, जब आप डॉटनेट एसडीके स्थापित करते हैं तो क्या यह एमएसबिल्ट को भी स्थापित करता है? यदि ऐसा है तो यह उस संस्करण से भिन्न है जिसे vs2017 के साथ स्थापित किया गया है?

मुझे इस पर यकीन नहीं था, लेकिन यह परीक्षण करना आसान था। मैंने सभी msbuild.exe हटा दिए हैं और यह अभी भी काम कर रहा है। पता चला कि यह SDK फ़ोल्डर में msbuild.dll का उपयोग कर रहा है। उदाहरण के लिए "C: \ Program Files \ dotnet \ sdk \ 1.0.3 \ MSBuild.dll"

यदि आप उस एक को हटाते हैं, तो एक प्रमाण है:

जब msbuild.dll हटाया गया

msbuild.dll वास्तव में msbuild.exe है, जैसा कि आप गुणों में देख सकते हैं:

SDK 1.0.3 के msbuild.dll गुण

कुछ कोड

यदि आप डॉटनेट सीएलआई के कोड को देखते हैं, तो आप देख सकते हैं कि यह msbuildकमांड उत्पन्न कर रहा है ।

उदाहरण के लिए dotnet restore, RestoreCommandडॉटनेट सीएलआई के अंदर वर्ग द्वारा बनाया गया है ।

एक छीन लिया संस्करण:

public class RestoreCommand : MSBuildForwardingApp
{
    ...
    public static RestoreCommand FromArgs(string[] args, string msbuildPath = null)
    {
        var result = parser.ParseFrom("dotnet restore", args);
        ...
        var msbuildArgs = new List<string>
        {
            "/NoLogo",
            "/t:Restore",
            "/ConsoleLoggerParameters:Verbosity=Minimal"
        };
        ...
        return new RestoreCommand(msbuildArgs, msbuildPath);
    }

    public static int Run(string[] args)
    {
        RestoreCommand cmd;
        try
        {
            cmd = FromArgs(args);
        }
        catch (CommandCreationException e)
        {
            return e.ExitCode;
        }

        return cmd.Execute();
    }
    ...
}

आप देख सकते हैं dotnet restoreबस बुला रहा हैmsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal


यदि आप RestoreCommandके समय मेंdotnet v1.0.0 RC2 जांच करते हैं , तो यह उपयोग नहीं कर msbuildरहा था लेकिन nugetसीधे कॉल कर रहा था ।

return NuGet3.Restore(args, quiet);

dotnetऔर के बीच मैपिंगmsbuild

मैंने dotnetऔर के बीच एक मैपिंग की msbuild। यह पूर्ण नहीं है, लेकिन महत्वपूर्ण आदेश हैं।

Dotnet                 | Msbuild                                    | Remarks                         
-----------------------|--------------------------------------------|---------------------------------
Add                    |                                            |         
-----------------------|--------------------------------------------|---------------------------------                        
Build                  | /t:Build                                   |  
-----------------------|--------------------------------------------|---------------------------------                                
Build --no-incremental | /t:Rebuild                                 |    
-----------------------|--------------------------------------------|---------------------------------                              
Clean                  | /t:clean                                   |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Complete               |                                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Help                   |                                            | Help!                           
-----------------------|--------------------------------------------|--------------------------------- 
List                   |                                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Migrate                | -                                          |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Msbuild                |                                            | Forwarding all                  
-----------------------|--------------------------------------------|--------------------------------- 
New                    |                                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Nuget                  |                                            |  *
-----------------------|--------------------------------------------|--------------------------------- 
Pack                   | /t:pack                                    |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Publish                | /t:publish                                 |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Remove                 |                                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Restore                | /NoLogo /t:Restore                         |
                         /ConsoleLoggerParameters:Verbosity=Minimal |
-----------------------|--------------------------------------------|--------------------------------- 
Run                    | /nologo /verbosity:quiet                   |
                         /p:Configuration=   /p:TargetFramework     |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Sln                    |                                            | Not in msbuild                  
-----------------------|--------------------------------------------|--------------------------------- 
Store                  | /t:ComposeStore                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Test                   | /t:VSTest /v:quiet /nologo                 |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Vstest                 |                                            | Forwarding to vstest.console.dll

*dotnet nuget: csproj में संकुल जोड़ना / हटाना, nuget.exe का सीमित सेट, तुलना देखें

पुनश्च अतः में कोई markdown टेबल :(


msbuildNuGet संकुल को पुनर्स्थापित नहीं करता है, इसलिए मुझे नहीं लगता कि आप थोड़ा और अधिक संदर्भ के बिना "दोनों ठीक कर सकते हैं" कह सकते हैं। अन्य भाग अच्छे लगते हैं।
लेक्स ली

5
msbuild /t:restoreनया पुनर्स्थापना है। इसे कोड के साथ दिखाया। यह नया है (जैसा कि पहले msbuild का उपयोग नहीं कियाdotnet गया था )
जूलियन

शानदार जवाब .. मेरे पास बस एक और सवाल है (मैंने मूल सवाल अपडेट कर दिया है)। यदि आप जवाब दे सकते हैं कि मैं इसकी बहुत सराहना करूंगा और आपके उत्तर को स्वीकार
करूंगा

अच्छा प्रश्न। मुझे यकीन नहीं था और यह परीक्षण किया। निष्कर्ष: यह खुद का उपयोग करता है msbuild.dll। पोस्ट को अपडेट किया।
जूलियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.