dotnetcliと新しいvs2017msbuildの関係


88

以下からの移行に伴いproject.json、新規にcsprojVS2017で導入された形式で、私は違いを理解するのに苦労していdotnetCLIと新しいmsbuildとときに、他の上で1つを使用する方法を。

1)新しいビルドするにはcsproj、私が呼び出しされなければならない、コマンドラインからnetstandardライブラリをdotnet例えば、CLI( dotnet restore dotnet build)または使用をmsbuild(たとえばmsbuild ExampleNetstandard.sln)。

2)また、私の理解では、の2つのバージョンがありmsbuild、1つは完全なフレームワークに基づいて構築され、もう1つはターゲティングに基づいていdotnet coreます。これは正しいです?私は常に使用する必要がありますdotnet version

3)dotnet cliスタンドアロンですか、それともmsbuildインストールする必要がありますか?たとえば、dotnet SDKをインストールすると、msbuildもインストールされますか?もしそうなら、これはvs2017でインストールされているバージョンとは異なりますか?

回答:


148

質問

1)コマンドラインから新しいcsproj netstandardライブラリをビルドするには、dotnet cli(たとえば、dotnet restore dotnet build)を呼び出すか、msbuild(たとえば、msbuild ExampleNetstandard.sln)を使用する必要があります。

現在dotnetはの上に構築されているため、どちらも問題なく動作しますmsbuild。だからそれは好みの問題です。dotnetCLIを使用してmsbuildタスクを呼び出すこともできます。(dotnet msbuild <msbuild_arguments>

当初、すべての.NETコアのものはにのみ含まれdotnetていましたmsbuild。すでに構築さmsbuildれているものの多くがdotnet箱から出してうまく機能していなかったため、これは面倒でした(Xamarinなど)。そこで、彼らはものをに移動し、その上にmsbuild構築しdotnetましたmsbuild

dotnetmsbuildように、にない機能がいくつかありますdotnet new。私の意見でdotnetは、よりも使いやすいmsbuildので、私は好みdotnetます。

より明確にするために、投稿の最後にmsbuildとの比較を追加しましたdotnet

2)また、msbuildには2つのバージョンがあり、1つは完全なフレームワーク上に構築され、もう1つはドットネットコアをターゲットにしていることを理解しています。これは正しいです?常にドットネットバージョンを使用する必要があります

msbuildは1つだけです。dotnetCLIはmsbuildを使用しています。

CLIはビルドエンジンとしてMSBuildを使用するため、ツールのこれらの部分は、ビルドプロセス全体に参加できるため、カスタムMSBuildターゲットおよびタスクとして作成することをお勧めします。

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

の古いバージョンにmsbuildは、.NETCoreのサポートがありませんでした。多分それは他のバージョンです;)

数ヶ月前は非常に異なっていたので、混乱することに同意します。

3)dotnet cliはスタンドアロンですか、それともmsbuildをインストールする必要がありますか?たとえば、dotnet SDKをインストールすると、msbuildもインストールされますか?もしそうなら、これはvs2017でインストールされているバージョンとは異なりますか?

これについてはよくわかりませんでしたが、テストは簡単でした。すべてのmsbuild.exeを削除しましたが、それでも機能します。SDKフォルダのmsbuild.dllを使用していることがわかりました。例:「C:\ ProgramFiles \ dotnet \ sdk \ 1.0.3 \ MSBuild.dll」

それを削除すると、証拠があります。

msbuild.dllが削除されたとき

プロパティで確認できるように、msbuild.dllは実際にはmsbuild.exeです。

SDK1.0.3のmsbuild.dllプロパティ

いくつかのコード

dotnet CLIのコードを調べると、msbuildコマンドを生成していることがわかります。

たとえばdotnet restore、はRestoreCommanddotnetCLI内クラスによって作成されます

ストリップバージョン:

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);

間のマッピングdotnetmsbuild

私はとの間のマッピングをしたdotnetmsbuild。完全ではありませんが、重要なコマンドがあります。

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の限定セット、比較を参照

PS SOでダウンなしのテーブル:(


msbuildNuGetパッケージは復元されないため、もう少しコンテキストがないと「どちらも問題ない」とは言えないと思います。他の部分はよさそうだ。
Lex Li

5
msbuild /t:restore新しい復元です。コードで表示しました。これは新しいものです(以前dotnetはmsbuildを使用していませんでした
Julian

すばらしい答えです。もう1つ質問があります(元の質問を更新しました)。あなたが答えることができれば、私はそれを大いに感謝し、あなたの答えを受け入れます
kimsagro 2017

良い質問。よくわからないのでテストしました。結論:独自のmsbuild.dllを使用します。投稿を更新しました。
ジュリアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.