web-dev-qa-db-ja.com

.NET Coreがインストールされていないマシンで動作するように、コマンドラインを介して.NET Coreアプリを構築する

私の最終目標は、クロスプラットフォーム(非Web)コンソールアプリケーションを作成することなので、今は.NET Coreを調査しています。

以前の.NETプロジェクトでは、Visual Studio内ですべての開発を行いましたが、プロジェクト全体(セットアップ、NuGetパッケージ、バイナリを含むZipファイルを含む)をビルドできるように、バッチ/ MSBuildファイルも作成しましたなど)ワンクリックで。 これは以前のプロジェクトの例です

最終的には、.NET Coreテストプロジェクトで同様のことを行いたいと思います。
しかし、今は最初のステップで失敗しています。VisualStudioの外部でビルドできないため、結果は.NET Coreがインストールされていない別のWindowsマシンで動作します。
(最初のステップでは、クロスプラットフォーム部分を無視しています-Windowsで動作するようになります)


私が持っているもの

Visual Studio 2015 Community Edition内で次のように機能させることができました。

  1. visual Studioで新しいプロジェクトを作成します: "新しいプロジェクト"⇒ "Web"⇒ "コンソールアプリケーション(パッケージ)"

  2. visual Studio内で新しい公開プロファイルを作成します(メニューの[ビルド]⇒[公開])。
    これにより、 PowerShellスクリプト (および 設定を含むXMLファイル )が作成されます。

GitHubでの私のテストプロジェクト

メニューで[ビルド]⇒[発行]を再度実行すると、Visual Studioは以前に作成したPowerShellスクリプトを再度実行するようです。
結果は90 MBをわずかに上回り、598フォルダー内の825ファイルで構成され、次のようになります。

Visual Studio publish result

別のマシン(Win 7/.NET 4がインストールされている/ .NET Corenotがインストールされている)にコピーすると、動作します。


私がVisual Studioの外で同じ結果を得ようとしたこと

1. dotnet publish

この回答この回答 は、dnu publishを使用してコマンドラインから同じ結果を得ることができるように聞こえます。
。NET Coreの一部が現在もターゲットを移動していることを理解しているため、 明らかにdnuが代わりにdotnetになりました

だから私はdotnet publishを実行しようとしました(そして バッチファイル )を作成しました:

dotnet publish "%~dp0\src\CoreTestVisualStudio" -c Release -r win7-x64 -o "%~dp0\release\cli"

結果は.exeファイルと多数のDLLで構成され、25個のファイルと1.5 MBのみがすべて1つのフォルダーに格納されます。

dotnet publish result

明らかに.NET Coreランタイムはここにありません。予想どおり、このアプリは.NET Coreがインストールされていないマシン(上記と同じもの)で実行しようとするとクラッシュします。

2.公開プロファイルのPowerShellスクリプト

PowerShellスクリプト (パブリッシュプロファイルを作成したときに作成された) Visual Studioの外部 を実行しようとしましたが、スクリプトがいくつかのパラメーターを予期し、何がわからないので失敗しました合格する:

param($publishProperties, $packOutput, $nugetUrl)

スクリプトには次の行もあります。

# to learn more about this file visit http://go.Microsoft.com/fwlink/?LinkId=524327

...しかし、リンクは .NET Web開発およびツールブログのランディングページ を指しているだけです。


TL; DR

私は何を間違えていますか?

.NET Coreの最初のリリースは主にASP.NETに焦点を合わせていることを知っていますが、理解したように、ASP.NET Coreアプリもコンソールアプリであるため、基本的なコンソールアプリが機能すると考えました。
一方、ほとんどの コンソールアプリの「入門」ドキュメント はまだ不足しているため、コンソールアプリのdotnet publishがまだ終わっていないのではないでしょうか。

数日後に編集:私は間違って何もしていないと疑っており、.NET Coreコマンドラインツールの問題であるため、 コマンドラインツールに投稿しました'問題トラッカー

28

問題が解決しました!
それを 。NET Coreコマンドラインツールの問題追跡ツール に投稿しましたが、それはdotnet publish-.NET Coreがインストールされていないマシンでコンパイル済みアプリを実行するために必要なC++ランタイムをバンドルしていませんでした。

  • 一時的な解決策は、C++ランタイムをインストールすることでした。

  • 「実際の」ソリューション プルリクエストで作成されました 3日前、これは 最新のインストーラー に含まれています。
    このバージョンでは、dotnet publishdoesはC++ランタイムをバンドルするため、結果は.NET Coreのないマシンで機能します。

20

dnuの場合:

dnu publishという--runtimeというオプションがあり、公開時に含めるランタイムを指定します。コマンドでは、完全なランタイム名を使用します。例:

dnu publish --runtime dnx-clr-win-x86.1.0.0-rc1

dotnetの場合:

ランタイムまたはフレームワークのバージョンを指定する必要はありません。デフォルトでは、dotnet publishproject.jsonおよび現在のランタイムフレーバーのフレームワークを使用します。ただし、 documentation は次のことを示しています。

dotnet-publishコマンドを使用するには、project.jsonに特定の依存関係が必要です。つまり、コマンドがランタイムファイルとアプリケーションのファイルを公開場所にコピーするためには、Microsoft.NETCore.Runtimeパッケージが依存関係として参照される必要があります。

5
Rytmis