この記事は、.NET 10 SDK 以降のバージョン ✔️ 適用されます
ファイル ベースのアプリを使用すると、従来のプロジェクト ファイルを作成することなく、1 つの C# ファイルから .NET アプリケーションをビルド、実行、発行できます。 従来の .NET プロジェクトに代わる軽量の代替手段を提供します。 このアプローチにより、スクリプト、ユーティリティ、および小規模アプリケーションの開発が簡略化されます。 .NET SDK は、ソース ファイル内のディレクティブに基づいて、必要なプロジェクト構成を自動的に生成します。
主な利点は次のとおりです。
- 簡単な適用のための減らされた定型文。
- 埋め込み構成を持つ自己完結型ソース ファイル。
- 네이티브 AOT 발행은 기본값으로 활성화되어 있습니다.
- .NET ツールとしての自動パッケージ化。
この記事では、ファイル ベースのアプリを効果的に作成、構成、操作する方法について説明します。
サポートされているディレクティブ
ファイル ベースのアプリでは、ビルドを構成してアプリケーションを実行するために、 #: のプレフィックスが付いたディレクティブを使用します。 サポートされるディレクティブには、 #:package、 #:project、 #:property、および #:sdkが含まれます。 これらのディレクティブを C# ファイルの先頭に配置します。
#:package
NuGet パッケージ参照をアプリケーションに追加します。
#:package Newtonsoft.Json
#:package Serilog version="3.1.1"
#:project
プロジェクト ファイルを含む別のプロジェクト ファイルまたはディレクトリを参照します。
#:project ../SharedLibrary/SharedLibrary.csproj
#:property
MSBuild プロパティ値を設定します。
#:property TargetFramework=net10.0
#:property PublishAot=false
#:sdk
使用する SDK を指定します。 既定値は Microsoft.NET.Sdk です。
#:sdk Microsoft.NET.Sdk.Web
CLI コマンド
.NET CLI では、使い慣れたコマンドを使用してファイル ベースのアプリを完全にサポートします。
アプリケーションの実行
dotnet run コマンドを使用して、ファイル ベースのアプリを直接実行します。
dotnet run file.cs
または、短縮形の構文を使用します。
dotnet file.cs
引数を渡す
いくつかの方法でアプリケーションに引数を渡します。
dotnet run file.cs -- arg1 arg2
--後の引数は、アプリケーションに渡されます。
--を指定しない場合、引数は dotnet run コマンドに移動します。
dotnet run file.cs arg1 arg2
ただし、省略形構文では、すべての引数がアプリケーションに渡されます。
dotnet file.cs arg1 arg2
アプリケーションをビルドする
dotnet build コマンドを使用して、ファイル ベースのアプリをコンパイルします。
dotnet build file.cs
SDK によって一時的なプロジェクトが生成され、アプリケーションがビルドされます。
ビルド出力をクリーンアップする
dotnet clean コマンドを使用してビルド成果物を削除します。
dotnet clean file.cs
ディレクトリ内のすべてのファイル ベースのアプリをクリーンアップします。
dotnet clean file-based-apps
アプリケーションを発行する
dotnet publish コマンドを使用してデプロイ パッケージを作成します。
dotnet publish file.cs
ファイル ベースのアプリでは、既定でネイティブ AOT 発行が有効にされ、最適化された自己完結型の実行可能ファイルが生成されます。
パッケージ化してツールとする
dotnet pack コマンドを使用して、ファイル ベースのアプリを .NET ツールとしてパッケージ化します。
dotnet pack file.cs
ファイルベースのアプリは、既定で PackAsTool=true 設定されます。
プロジェクトに変換する
dotnet project convert コマンドを使用して、ファイル ベースのアプリを従来のプロジェクトに変換します。
dotnet project convert file.cs
このコマンドは、同等の SDK とプロパティを持つ .csproj ファイルを作成します。 すべての # ディレクティブは、 .cs ファイルから削除され、対応する .csproj ファイル内の要素に変換されます。
依存関係を復元する
dotnet restore コマンドを使用して、ファイルで参照されている NuGet パッケージを復元します。
dotnet restore file.cs
復元は、アプリケーションをビルドまたは実行するときに暗黙的に実行されます。
既定の含まれる項目
ファイル ベースのアプリには、コンパイルとパッケージ化のための特定のファイルの種類が自動的に含まれます。
既定では、次の項目が含まれます。
- 単一の C# ファイル自体。
- 同じディレクトリ内の ResX リソース ファイル。
さまざまな SDK には、他のファイルの種類が含まれます。
-
Microsoft.NET.Sdk.Webには、*.json構成ファイルが含まれています。 - その他の特殊な SDK には、他のパターンが含まれる場合があります。
ネイティブ AOT の発行
ファイル ベースのアプリでは、既定でネイティブの事前コンパイル (AOT) が有効になります。 この機能により、起動速度が速くメモリ占有領域が小さい、最適化された自己完結型の実行可能ファイルが生成されます。
ネイティブ AOT を無効にする必要がある場合は、次の設定を使用します。
#:property PublishAot=false
ネイティブ AOT の詳細については、「 ネイティブ AOT のデプロイ」を参照してください。
ユーザー シークレット
ファイル ベースのアプリでは、完全なファイル パスのハッシュに基づいて、安定したユーザー シークレット ID が生成されます。 この ID を使用すると、ソース コードとは別に機密性の高い構成を格納できます。
従来のプロジェクトと同じ方法でユーザー シークレットにアクセスします。
dotnet user-secrets set "ApiKey" "your-secret-value" --project file.cs
詳細については、「 開発中のアプリ シークレットの安全なストレージ」を参照してください。
起動プロファイル
ファイル ベースのアプリでは、開発中にアプリケーションを実行する方法を構成するための起動プロファイルがサポートされます。 ファイル ベースのアプリでは、起動プロファイルを Properties/launchSettings.jsonに配置する代わりに、ソース ファイルと同じディレクトリに [ApplicationName].run.json という名前のフラット起動設定ファイルを使用できます。
フラット起動設定ファイル
アプリケーションにちなんだ起動設定ファイルを作成します。 たとえば、ファイル ベースのアプリが app.csされている場合は、同じディレクトリに app.run.json を作成します。
{
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
複数のファイル ベースのアプリ
同じディレクトリに複数のファイル ベースのアプリがある場合、各アプリは独自の起動設定ファイルを持つことができます。
📁 myapps/
├── foo.cs
├── foo.run.json
├── bar.cs
└── bar.run.json
プロファイルの選択
.NET CLI は、次の優先順位を使用して起動プロファイルを選択します。
-
--launch-profileオプションで指定されたプロファイル。 -
DOTNET_LAUNCH_PROFILE環境変数で指定されたプロファイル。 - 起動設定ファイルで定義されている最初のプロファイル。
特定のプロファイルで実行するには:
dotnet run app.cs --launch-profile https
従来の起動設定
ファイル ベースのアプリは、従来の Properties/launchSettings.json ファイルもサポートしています。 両方のファイルが存在する場合は、従来の場所が優先されます。 両方のファイルが存在する場合、.NET CLI は警告をログに記録して、どのファイルが使用されているかを明確にします。
シェルの実行
shebang 行と実行可能なアクセス許可を使用して、Unix に似たシステムでファイル ベースのアプリを直接実行できるようにします。
ファイルの先頭に shebang を追加します。
#!/usr/bin/env dotnet
#:package Spectre.Console
using Spectre.Console;
AnsiConsole.MarkupLine("[green]Hello, World![/]");
ファイルを実行可能にする:
chmod +x file.cs
直接実行します。
./file.cs
暗黙的なビルド ファイル
ファイル ベースのアプリでは、同じディレクトリまたは親ディレクトリ内の MSBuild および NuGet 構成ファイルが考慮されます。 これらのファイルは、SDK によるアプリケーションのビルド方法に影響します。 ファイルベースのアプリを整理するときは、これらのファイルに注意してください。
Directory.Build.props
ディレクトリ ツリー内のすべてのプロジェクトに適用される MSBuild プロパティを定義します。 ファイル ベースのアプリは、これらのプロパティを継承します。
Directory.Build.targets
MSBuild ターゲットとカスタム ビルド ロジックを定義します。 ファイル ベースのアプリは、ビルド中にこれらのターゲットを実行します。
Directory.Packages.props
NuGet 依存関係の中央パッケージ管理を有効にします。 ファイル ベースのアプリでは、一元管理されたパッケージ バージョンを使用できます。
nuget.config
NuGet パッケージのソースと設定を構成します。 ファイル ベースのアプリは、パッケージを復元するときにこれらの構成を使用します。
global.json
使用する .NET SDK のバージョンを指定します。 ファイル ベースのアプリでは、このバージョンの選択が優先されます。
ビルド キャッシュ
.NET SDK は、後続のビルドのパフォーマンスを向上させるためにビルド出力をキャッシュします。 ファイル ベースのアプリは、このキャッシュ システムに参加します。
キャッシュの動作
SDK は、次に基づいてビルド出力をキャッシュします。
- ソース ファイルの内容。
- ディレクティブの設定。
- SDK バージョン。
- 暗黙的なビルド ファイル。
キャッシュを使用するとビルドのパフォーマンスが向上しますが、次の場合に混乱を招く可能性があります。
- 暗黙的なビルド ファイルを変更しても、再構築はトリガーされません。
- ファイルを別のディレクトリに移動してもキャッシュは無効になりません。
対処方法
--no-cacheフラグを使用して完全ビルドを実行します。dotnet build file.cs --no-cacheキャッシュをバイパスするようにクリーン ビルドを強制します。
dotnet clean file.cs dotnet build file.cs
フォルダー レイアウトに関する推奨事項
ファイル ベースのアプリを慎重に整理して、従来のプロジェクトや暗黙的なビルド ファイルとの競合を回避します。
プロジェクト ファイルの円錐を避ける
ファイル ベースのアプリは、 .csproj プロジェクトのディレクトリ構造内に配置しないでください。 プロジェクト ファイルの暗黙的なビルド ファイルと設定は、ファイル ベースのアプリに干渉する可能性があります。
❌ お勧めしません。
📁 MyProject/
├── MyProject.csproj
├── Program.cs
└──📁 scripts/
└── utility.cs // File-based app - bad location
✅ 推奨:
📁 MyProject/
├── MyProject.csproj
└── Program.cs
📁 scripts/
└── utility.cs // File-based app - good location
暗黙的なファイルに注意する
親ディレクトリ内の暗黙的なビルド ファイルは、サブディレクトリ内のすべてのファイル ベースのアプリに影響します。 異なるビルド構成が必要な場合は、ファイル ベースのアプリ用の分離ディレクトリを作成します。
❌ お勧めしません。
📁 repo/
├── Directory.Build.props // Affects everything below
├── app1.cs
└── app2.cs
✅ 推奨:
📁 repo/
├── Directory.Build.props
├──📁 projects/
│ └── MyProject.csproj
└──📁 scripts/
├── Directory.Build.props // Isolated configuration
├── app1.cs
└── app2.cs
こちらも参照ください
.NET