directory-build-organization
`Directory.Build.props` / `Directory.Build.targets` / `Directory.Packages.props` / `Directory.Build.rsp` を活用したMSBuildインフラの整理・構成を支援するスキルです。マルチプロジェクトリポジトリのビルド設定集約、`ManagePackageVersionsCentrally` によるNuGet Central Package Management (CPM) の導入、`GetPathOfFileAbove` を使った多階層Directory.Buildヒエラルキーの構築、および評価順序(`Directory.Build.props` → SDK .props → .csproj → SDK .targets → `Directory.Build.targets`)の理解に活用してください。MSBuild / .NETビルドのコンテキスト以外や、単一プロジェクト・非SDK形式プロジェクトへの移行には使用しないでください。
description の原文を見る
Guide for organizing MSBuild infrastructure with Directory.Build.props, Directory.Build.targets, Directory.Packages.props, and Directory.Build.rsp. Only activate in MSBuild/.NET build context. USE FOR: structuring multi-project repos, centralizing build settings, implementing NuGet Central Package Management (CPM) with ManagePackageVersionsCentrally, consolidating duplicated properties across .csproj files, setting up multi-level Directory.Build hierarchy with GetPathOfFileAbove, understanding evaluation order (Directory.Build.props → SDK .props → .csproj → SDK .targets → Directory.Build.targets). Critical pitfall: $(TargetFramework) conditions in .props silently fail for single-targeting projects — must use .targets. DO NOT USE FOR: non-MSBuild build systems, migrating legacy projects to SDK-style (use msbuild-modernization), single-project solutions with no shared settings. INVOKES: no tools — pure knowledge skill.
SKILL.md 本文
Directory.Build ファイルを使用したビルド インフラストラクチャの構成
Directory.Build.props vs Directory.Build.targets
どちらのファイルを使用すべきかを理解することは重要です。これらはビルド評価中にインポートされるタイミングが異なります。
評価順序:
Directory.Build.props → SDK .props → YourProject.csproj → SDK .targets → Directory.Build.targets
.props で使用 | .targets で使用 |
|---|---|
| プロパティのデフォルト値設定 | カスタム ビルド ターゲット |
| 共通の項目定義 | 後期バインディング プロパティ オーバーライド |
| プロジェクトがオーバーライドできるプロパティ | ビルド後ステップ |
| アセンブリ/パッケージ メタデータ | 最終値の条件付きロジック |
| アナライザー PackageReferences | SDK定義プロパティに依存するターゲット |
経験則: プロパティと項目は .props に配置します。カスタム ターゲットと後期バインディング ロジックは .targets に配置します。
.props はプロジェクト ファイルの前にインポートされるため、プロジェクトはそこで設定された任意の値をオーバーライドできます。.targets はすべての後でインポートされるため、最終的な決定権を持ちます。ただし、プロジェクトは .targets の値をオーバーライドできません。
⚠️ 重要: .props vs .targets での TargetFramework の利用可能性
.props ファイルで $(TargetFramework) の条件が設定されたプロパティは、シングル ターゲット プロジェクトでは暗黙的に失敗します — .props 評価中にプロパティは空です。TFM条件付きプロパティを代わりに .targets に移動してください。ItemGroup と Target の条件は影響を受けません。
完全な説明については targetframework-props-pitfall.md を参照してください。
Directory.Build.props
推奨される用途: 言語設定、アセンブリ/パッケージ メタデータ、ビルド警告、コード分析、共通のアナライザー。
<Project>
<PropertyGroup>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<Company>Contoso</Company>
<Authors>Contoso Engineering</Authors>
</PropertyGroup>
</Project>
ここに配置しないでください: プロジェクト固有の TFM、プロジェクト固有の PackageReferences、ターゲット/ビルド ロジック、またはSDK定義値に依存するプロパティ(.props 評価中は利用できません)。
Directory.Build.targets
推奨される用途: カスタム ビルド ターゲット、後期バインディング プロパティ オーバーライド(SDK プロパティに依存する値)、ビルド後検証。
<Project>
<Target Name="ValidateProjectSettings" BeforeTargets="Build">
<Error Text="All libraries must target netstandard2.0 or higher"
Condition="'$(OutputType)' == 'Library' AND '$(TargetFramework)' == 'net472'" />
</Target>
<PropertyGroup>
<!-- DocumentationFile は、SDK によって設定される OutputPath に依存 -->
<DocumentationFile Condition="'$(IsPackable)' == 'true'">$(OutputPath)$(AssemblyName).xml</DocumentationFile>
</PropertyGroup>
</Project>
Directory.Packages.props (Central Package Management)
Central Package Management (CPM) は、すべての NuGet パッケージ バージョンの唯一の情報源を提供します。詳細については https://learn.microsoft.com/en-us/nuget/consume-packages/central-package-management を参照してください。
リポジトリ ルートの Directory.Packages.props で CPM を有効にする:
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="xunit" Version="2.9.0" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
</ItemGroup>
<ItemGroup>
<!-- GlobalPackageReference はすべてのプロジェクトに適用 — アナライザーに最適 -->
<GlobalPackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
<GlobalPackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0" />
</ItemGroup>
</Project>
Directory.Build.rsp
ディレクトリ ツリー下のすべてのビルドに適用される既定の MSBuild CLI 引数を含みます。
サンプル Directory.Build.rsp:
/maxcpucount
/nodeReuse:false
/consoleLoggerParameters:Summary;ForceNoAlign
/warnAsMessage:MSB3277
- 最新の .NET バージョンでは
msbuildとdotnetCLI の両方で動作 - 一貫した CI とローカル ビルド フラグの実装に最適
- 各引数は独立した行に配置
マルチレベル Directory.Build ファイル
MSBuild は、プロジェクト ディレクトリから上方向へ探索して見つかった最初の Directory.Build.props(または .targets)のみを自動インポートします。複数のレベルをチェーンするには、内側のファイルの先頭で親を明示的にインポートしてください。完全なファイル例については multi-level-examples を参照してください。
<Project>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))"
Condition="Exists('$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))')" />
<!-- 内側レベルのオーバーライドをここに配置 -->
</Project>
レイアウト例:
repo/
Directory.Build.props ← リポジトリ全体(言語バージョン、企業情報、アナライザー)
Directory.Build.targets ← リポジトリ全体のターゲット
Directory.Packages.props ← 中央パッケージ バージョン
src/
Directory.Build.props ← src固有(リポジトリレベルをインポート、IsPackable=true に設定)
test/
Directory.Build.props ← test固有(リポジトリレベルをインポート、IsPackable=false に設定、テストパッケージを追加)
アーティファクト出力レイアウト (.NET 8+)
Directory.Build.props に <ArtifactsPath>$(MSBuildThisFileDirectory)artifacts</ArtifactsPath> を設定すると、自動的にプロジェクト名で区切られた bin/、obj/、publish/ ディレクトリが単一の artifacts/ フォルダの下に生成され、bin/obj の競合をデフォルトで回避します。ディレクトリ レイアウトおよび追加パターン(プロジェクト タイプ別の条件付き設定、pack 後検証)については common-patterns を参照してください。
ワークフロー: ビルド インフラストラクチャの構成
- すべての
.csprojファイルを監査 — ソリューション全体の<PropertyGroup>、<ItemGroup>、カスタム<Target>をカタログ化します。どの設定が繰り返されているか、どの設定がプロジェクト固有かをメモします。 - ルート
Directory.Build.propsを作成 — 共有プロパティのデフォルト値(LangVersion、Nullable、TreatWarningsAsErrors、メタデータ)をここに移動します。これらはプロジェクト ファイルの前にインポートされるため、プロジェクトはそれらをオーバーライドできます。 - ルート
Directory.Build.targetsを作成 — カスタム ビルド ターゲット、ビルド後検証、および SDK定義値に依存するプロパティ(例えばOutputPath、シングル ターゲット プロジェクトのTargetFramework)をここに移動します。これらは SDK の後でインポートされるため、すべてのプロパティが利用可能です。 Directory.Packages.propsを作成 — Central Package Management を有効にし(ManagePackageVersionsCentrally)、すべてのPackageVersionエントリをリストし、.csprojファイルのPackageReferenceアイテムからVersion=を削除します。- マルチレベル階層をセットアップ —
src/およびtest/フォルダ用に内側のDirectory.Build.propsファイルを作成し、異なる設定を指定します。GetPathOfFileAboveを使用して親へチェーンします。 .csprojファイルを簡素化 — すべての一元化されたプロパティ、バージョン属性、および重複したターゲットを削除します。各プロジェクトはそれに固有の内容のみを含むべきです。- 検証 —
dotnet restore && dotnet buildを実行し、回帰がないことを確認します。必要に応じてdotnet msbuild -pp:output.xmlを使用して最終的なマージされたビューを検査します。
トラブルシューティング
| 問題 | 原因 | 解決方法 |
|---|---|---|
Directory.Build.props が選択されない | ファイル名の大文字小文字が間違っている(Linux/macOS では正確なマッチが必要) | 正確な大文字小文字を確認: Directory.Build.props(大文字の D、B) |
.props のプロパティがプロジェクトに無視される | プロジェクトがインポート後に同じプロパティを設定している | プロパティを Directory.Build.targets に移動してプロジェクト後に設定 |
| マルチレベル インポートが機能しない | 内側のファイルに GetPathOfFileAbove インポートがない | 内側のファイルの先頭に <Import> 要素を追加(マルチレベル セクションを参照) |
SDK値を使用するプロパティが .props で空 | SDK プロパティが .props 評価中にまだ定義されていない | .targets に移動(SDK の後でインポートされます) |
Directory.Packages.props が見つからない | ファイルがリポジトリ ルートにないか、名前が正確でない | Directory.Packages.props という名前で、プロジェクト ディレクトリ以上に配置してください |
.props の $(TargetFramework) のプロパティ条件が一致しない | シングル ターゲット プロジェクトの場合、.props 評価中に TargetFramework が設定されていない | プロパティを .targets に移動するか、ItemGroup/Target 条件を代わりに使用(これらは後期に評価) |
診断: 前処理されたプロジェクト出力を使用してすべてのインポートと最終プロパティ値を確認します:
dotnet msbuild -pp:output.xml MyProject.csproj
これはすべてのインポートをインラインで展開し、各プロパティが設定されている場所と最終的な評価値を正確に確認できます。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- dotnet
- リポジトリ
- dotnet/skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/dotnet/skills / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。