dotnet-scaffold-project について
一般的なプロジェクトテンプレートと共有ビルド設定を使って、.NET ソリューションを作成するスキルです。開発者向けに初期設定、整理、検証を案内し、Central Package Management やアナライザーの設定も扱います。
主な機能
- 01ソリューションとプロジェクト構成の作成
- 02SDK 固定と共有ビルドプロパティの設定
- 03Central Package Management の設定
- 04エディターとパッケージソースの設定
- 05復元・ビルド・テストの検証
活用シーン
- 01ライブラリとテストを含む .NET Web API の開始
- 02コンソール、Worker、Blazor プロジェクトの作成
- 03ソリューション全体のビルド設定の統一
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wshaddix/ dotnet-skills --skill dotnet-scaffold-projectインストール後、Claude Code で/dotnet-scaffold-projectを入力して読み込まれたか確認します。
詳細
dotnet-scaffold-project
最新のベストプラクティスをすべて適用した新しい .NET プロジェクトをスキャフォールディングします。Central Package Management、アナライザー、.editorconfig、SourceLink、決定的ビルドを含むソリューション構造全体を生成します。
前提条件: 使用可能な SDK バージョンを確認するため、最初に [skill:dotnet-version-detection] を実行してください。利用できる機能やテンプレートは、この結果によって異なります。
関連項目:レイアウトの根拠については [skill:dotnet-project-structure]、アナライザーの構成については [skill:dotnet-add-analyzers]、スキャフォールディング後に CI を追加する方法については [skill:dotnet-add-ci] を参照してください。
ステップ 1:ソリューション構造を作成する
ディレクトリ構成とソリューションファイルを作成します。
# Create the directory structure
mkdir -p MyApp/src MyApp/tests
# Create solution file
cd MyApp
dotnet new sln -n MyApp
# For .NET 9+ SDK, convert to .slnx
dotnet sln MyApp.sln migrate
プロジェクトテンプレートを選択する
アプリケーションの種類に応じて、適切なテンプレートを選択します。
| テンプレート | コマンド | SDK |
|---|---|---|
| Web API(最小構成) | dotnet new webapi -n MyApp.Api -o src/MyApp.Api | Microsoft.NET.Sdk.Web |
| Web API(コントローラー) | dotnet new webapi -n MyApp.Api -o src/MyApp.Api --use-controllers | Microsoft.NET.Sdk.Web |
| コンソールアプリ | dotnet new console -n MyApp.Cli -o src/MyApp.Cli | Microsoft.NET.Sdk |
| ワーカーサービス | dotnet new worker -n MyApp.Worker -o src/MyApp.Worker | Microsoft.NET.Sdk.Worker |
| クラスライブラリ | dotnet new classlib -n MyApp.Core -o src/MyApp.Core | Microsoft.NET.Sdk |
| Blazor Web アプリ | dotnet new blazor -n MyApp.Web -o src/MyApp.Web | Microsoft.NET.Sdk.Web |
| MAUI アプリ | dotnet new maui -n MyApp.Mobile -o src/MyApp.Mobile | Microsoft.Maui.Sdk |
| xUnit テスト | dotnet new xunit -n MyApp.Tests -o tests/MyApp.Tests | Microsoft.NET.Sdk |
# Example: Web API with class library and tests
dotnet new classlib -n MyApp.Core -o src/MyApp.Core
dotnet new webapi -n MyApp.Api -o src/MyApp.Api
dotnet new xunit -n MyApp.UnitTests -o tests/MyApp.UnitTests
# Add projects to solution
dotnet sln add src/MyApp.Core/MyApp.Core.csproj
dotnet sln add src/MyApp.Api/MyApp.Api.csproj
dotnet sln add tests/MyApp.UnitTests/MyApp.UnitTests.csproj
# Add project references
dotnet add src/MyApp.Api/MyApp.Api.csproj reference src/MyApp.Core/MyApp.Core.csproj
dotnet add tests/MyApp.UnitTests/MyApp.UnitTests.csproj reference src/MyApp.Core/MyApp.Core.csproj
ステップ 2:global.json を追加する
再現可能なビルドのために、SDK バージョンを固定します。
{
"sdk": {
"version": "10.0.100",
"rollForward": "latestPatch"
}
}
バージョンは dotnet --version の出力に合わせて調整してください。
ステップ 3:Directory.Build.props を追加する
すべてのプロジェクトでビルド設定を共有できるよう、リポジトリのルートに作成します。
<Project>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>14</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<AnalysisLevel>latest-all</AnalysisLevel>
</PropertyGroup>
<PropertyGroup>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<DebugType>embedded</DebugType>
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
</PropertyGroup>
<PropertyGroup>
<NuGetAudit>true</NuGetAudit>
<NuGetAuditLevel>low</NuGetAuditLevel>
<NuGetAuditMode>all</NuGetAuditMode>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
</Project>
これを作成したら、重複を避けるため、個々の .csproj ファイルから <TargetFramework>、<Nullable>、<ImplicitUsings> を削除してください。
オプション:テスト用の props を分離する
<Project>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
<PropertyGroup>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<UseMicrosoftTestingPlatformRunner>true</UseMicrosoftTestingPlatformRunner>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
</Project>
ステップ 4:Directory.Build.targets を追加する
共有パッケージ参照(SourceLink、アナライザー)をすべてのプロジェクトに適用します。項目は、プロジェクトの評価後にインポートされるよう、.targets に記述します。
<Project>
<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="all" />
</ItemGroup>
</Project>
組み込みの Roslyn アナライザーは、Directory.Build.props の AnalysisLevel プロパティと EnforceCodeStyleInBuild プロパティによってすでに有効になっています(ステップ 3)。サードパーティ製アナライザーを追加する場合は、[skill:dotnet-add-analyzers] を参照してください。
ステップ 5:Central Package Management を設定する
リポジトリのルートに Directory.Packages.props を作成します。
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="9.0.0" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="xunit.v3" Version="3.2.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
<PackageVersion Include="coverlet.collector" Version="8.0.0" />
</ItemGroup>
</Project>
これを作成したら、.csproj ファイル内のすべての <PackageReference> 要素から Version 属性を削除してください。
ステップ 6:.editorconfig を追加する
リポジトリのルートに作成します。推奨設定の全体については、[skill:dotnet-project-structure] を参照してください。
最小限の構成例:
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{csproj,props,targets,xml,json,yml,yaml}]
indent_size = 2
[*.cs]
csharp_style_namespace_declarations = file_scoped:warning
csharp_prefer_braces = true:warning
dotnet_style_require_accessibility_modifiers = always:warning
dotnet_sort_system_directives_first = true
csharp_using_directive_placement = outside_namespace:warning
ステップ 7:nuget.config を追加する
サプライチェーンのセキュリティを考慮して、パッケージソースを設定します。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
</configuration>
ステップ 8:.gitignore を追加する
dotnet new gitignore
これにより、bin/、obj/、*.user などを対象とする、標準的な .NET の .gitignore が生成されます。
ステップ 9:生成されたプロジェクトを整理する
スキャフォールディング後、共有設定を適用します。
- 個々の
.csprojファイルから重複するプロパティを削除します(TargetFramework、Nullable、ImplicitUsings。これらは Directory.Build.props に記述されています)。 - PackageReference 要素からVersion 属性を削除します(CPM によって管理されます)。
- クラスライブラリからテンプレートが生成した Class1.cs を削除します。
- 生成されたすべての
.csファイルでファイルスコープの名前空間を設定します。
整理済み csproj の例
変更前(テンプレートによる生成):
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
変更後(共有 props および CPM を使用):
<Project Sdk="Microsoft.NET.Sdk">
</Project>
Microsoft.NET.Sdk.Web が必要な Web プロジェクトでは、csproj に SDK を指定したままにしますが、それ以外の設定はすべて継承されます。
ステップ 10:検証する
スキャフォールディングしたプロジェクトを検証するため、次のコマンドを実行します。
# Restore and verify lock files generated
dotnet restore
find . -name "packages.lock.json" -type f
# Build with all analyzers
dotnet build --no-restore
# Run tests
dotnet test --no-build
# Verify CPM is active (no Version attributes in project PackageReferences)
# Should only find versions in Directory.Packages.props, not in csproj files
find . -name "*.csproj" -exec grep -l 'Version=' {} \; # expect no output
最終的な構成
MyApp/
├── .editorconfig
├── .gitignore
├── global.json
├── nuget.config
├── MyApp.slnx
├── Directory.Build.props
├── Directory.Build.targets
├── Directory.Packages.props
├── src/
│ ├── MyApp.Core/
│ │ └── MyApp.Core.csproj
│ └── MyApp.Api/
│ ├── MyApp.Api.csproj
│ ├── Program.cs
│ └── appsettings.json
└── tests/
└── MyApp.UnitTests/
├── MyApp.UnitTests.csproj
└── SampleTest.cs