ウェーブを変更する
変更ウェーブ は、特定のフラグを環境変数として指定することでオプトアウトできる MSBuild の動作変更のセットです。 この目的は、変更が標準的な機能になる前に、これらの変更に柔軟に適応できるように、破壊的変更の可能性があることを警告することです。 特定の変更ウェーブ内のすべての機能は、個別に有効または無効にすることはできません。
新しいバージョンの MSBuild にアップグレードすると、破損する可能性がある変更は既定で有効になりますが、機能がビルドに悪影響を及ぼす場合は、その変更のウェーブを簡単に無効にすることができます。 各変更ウェーブは MSBuild のバージョン番号 (16.8 など) で識別されますが、変更ウェーブを設定すると、その MSBuild バージョンのすべての変更ではなく、ビルド プロセスに影響する可能性がある特定の機能のみが制御されます。 各変更ウェーブの機能の一覧は、この記事 の後半表示されます。 変更ウェーブを無効にすると、上位バージョンの変更ウェーブも無効になります。
変更ウェーブ機能のオプトアウト
変更ウェーブに含まれる機能を無効にするには、環境変数 MSBuildDisableFeaturesFromVersion
を、無効にしたい機能が含まれている変更ウェーブ (または MSBuild バージョン) に設定します。 これは、機能が開発された MSBuild のバージョンです。 以下の機能への変更ウェーブのマッピングを参照してください。
MSBuildDisableFeaturesFromVersion の値
有効な変更ウェーブに MSBuildDisableFeaturesFromVersion
を設定しない場合、警告を受け、既定の特定のウェーブに自動的に移行されます。 次の表に、使用可能な設定を示します。
MSBuildDisableFeaturesFromVersion 値 |
結果 | 警告を受信しますか? |
---|---|---|
未設定 | すべての変更ウェーブを有効にします。つまり、各変更ウェーブの背後にあるすべての機能が有効になります。 | いいえ |
任意の有効かつ現在の変更ウェーブ (たとえば、16.8 ) |
変更ウェーブ 16.8 およびそれ以降のすべての機能が無効になります。 |
いいえ |
無効な値 (たとえば、16.9 は有効なウェーブ 16.8 および 16.10 に対して無効です) |
既定値は、最も近い有効な値 (昇順) です。 たとえば、16.9 を設定すると、既定で 16.10 になります。 |
いいえ |
ローテーションから外れる(たとえば、最も高いウェーブが 17.0 の場合の 17.1 ) |
最も近い有効な値にクランプします。 17.1 を 17.0 に固定し、16.5 を 16.8 に固定します。 |
はい |
無効な形式 (たとえば、16x8 、17_0 、garbage ) |
すべての変更ウェーブを有効にします。つまり、各変更ウェーブの背後にあるすべての機能が有効になります。 | はい |
ウェーブと関連するフィーチャを変更する
17.10
- BinFmt を使用せずに AppDomain 構成をシリアル化する - 機能は編集によって実行時に BinaryFormatter が許可されている場合にのみオプトアウトできます
MSBuild.runtimeconfig.json
- キャッシュ SDK リゾルバーのデータ プロセス全体
17.8
- [RAR] SDK で提供される参照に対して I/O を実行しない
- コピーする前にコピー先ファイルを削除
- ハッシュ タスク の SHA1 から SHA256 への移動の
- カスタム派生 BuildEventArgs の非推奨化 - 機能をオプトアウトできるのは、BinaryFormatter が実行時に許可されるよう編集されている場合のみです
MSBuild.runtimeconfig.json
17.6
- ターゲット で無効なプロパティを解析する
- プロジェクト文字列キャッシュの を削除する
- インポートの指定された検索パスが存在しない場合にエラーをログに記録
- ログ アセンブリの読み込み
- AnyHaveMetadataValue 関数は空のリストが渡された場合、false が返されます
- ログ項目の自己拡張
17.4
- アセンブリ を読み込むときに deps.json を考慮する
- プラットフォーム ネゴシエーション 中に
Platform
を既定として検討する - SDK マニフェストへの承認済み SDK 名の一致パターンの追加
- 無効なプロジェクトの種類を示す警告を発する
- MSBuild サーバー
- カルチャの検証時に新しい CultureInfo API を呼び出す (.NET Core のみ)
17.0
- Scheduler は BuildParameters.DisableInprocNode を優先する必要があります
- .NET Framework で globbing 正規表現をコンパイルしない
- 既定でコンテンツ項目を推移的にコピーする
- 参照アセンブリが既定で
bin
ディレクトリに配置されなくなった (こちらで元に戻され、こちらで復活) - デバッグ エクスペリエンスの向上: グローバル スイッチ MSBuildDebugEngine を追加します。BuildManager からバイナリ ロガーを挿入する。静的グラフを .dot ファイルとして印刷
- BuildManager と LoggingService のデッドロックを修正する
- ファイル ロガーとコンソール ロガーの の diag レベルを最適化する
- 最適化された変更できないファイルの最新状態チェック
- ディレクトリ列挙 に Microsoft.IO.Redist を追加する
- ToolsetConfigurationSection のプロセス全体のキャッシュ
- RAR 出力パスを正規化
ローテーションから外れた変更ウェーブ
16.8
16.10
- 条件のプロパティ拡張に空白 がある場合にエラーが発生する
- TargetPath を使用して、CopyToOutputDirectory のカスタムロケーションを許可する
- exec を使用しているときに、ユーザー名に特定の特殊文字が含まれるユーザーが正常にビルドできるようにする
- SDK が解決できない場合に復元操作を失敗
- glob の評価を最適化する
FAQ
変更ウェーブをローテーションから外す場合に他のすべてのリリースを対象とするのはなぜですか?
私たちは、影響を受けた人々と話し合い、変化に適応するのに十分な時間だと信じています。
プロジェクト プロパティではなく環境変数が必要な理由
MSBuild がプロジェクトを読み込む前に、変更ウェーブの下に機能を配置するシナリオがあります。 そのため、変更ウェーブでは環境変数を使用する必要があります。
オプトインではなくオプトアウトする理由はなんですか?
オプトアウトは Microsoft にとってより優れたアプローチです。それ以外の場合は、機能が顧客のビルドに影響を与えたときに限られたフィードバックを受け取る可能性があります。
関連コンテンツ
- MSBuild
- MSBuild 16 の新機能