変更ウェーブ は、特定のフラグを環境変数として指定することでオプトアウトできる 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.1の場合の 17.0) |
最も近い有効な値にクランプします。
17.1 を 17.0に固定し、16.5 を 16.8 に固定します。 |
はい |
無効な形式 (たとえば、16x8、17_0、garbage) |
すべての変更ウェーブを有効にします。つまり、各変更ウェーブの背後にあるすべての機能が有効になります。 | はい |
ウェーブと関連するフィーチャを変更する
変化波の現在の回転
18.8
18.7
- 一時的なロック競合(例: macOS の CoW ファイルシステム)に対処するため、Windows 以外のプラットフォームで ERROR_ACCESS_DENIED が発生した場合にコピー タスクを再試行します
- ASP.NET WebSite プロジェクトを修正して netstandard2.0 の依存関係を解決します - TargetFrameworkVersion を RAR タスクに渡し、.NET Framework 4.7.1 以降の Web プロジェクトのファサード netstandard.dll コピーします。
18.6
- AbsolutePath.GetCanonicalForm の最適化 - パスに正規化が必要ない場合は、高価な Path.GetFullPath 呼び出しを回避する
- TaskHostTask は、要求レベルのグローバル プロパティ (MSBuildRestoreSessionId など) を -mt モードでアウトプロセス TaskHost に転送します
- OOP TaskHost で間違ったコレクションをチェックしている ShouldTreatWarningAsError を修正しました (WarningsAsErrors ではなく WarningsAsMessages)
- ツールが stdout/stderr パイプ ハンドルを継承する孫プロセスを生成するときに ToolTask がハングする問題を修正しました
18.5
- TaskEnvironment.GetAbsolutePath を使用しているときに、FindUnderPath タスクと AssignTargetPath タスクが無効なパス文字でスローされなくなりました
- Linux 上の AssignTargetPath は、常に大文字と小文字を無視するのではなく、ファイル システムの大文字と小文字の区別に従います
18.4
.NET 11 に付属するリリースで削除される変更ウェーブ
18.3
17.14
- ~ .SLNX のサポート - .sln および .slnx に新しいパーサーを使用 ~ 互換性の問題が見つかったため元に戻されました
-
RAR でのカスタム カルチャのサポート- 詳細については 11607 を参照してください - VS テレメトリ
17.12
- スカラー パラメーターの TaskParameterEvent をログに記録する
- プロパティ評価中の Convert.ToString では、すべての型に InvariantCulture が使用されます
- ResultsCache でのビルド結果の過剰な共有を修正する
- TaskParameterEventArgs に ParameterName と PropertyName を追加する
- いずれかのシンクから要求された場合、eval プロパティを出力する
- Microsoft.DotNet.MSBuildSdkResolver を既定の読み込みコンテキストに読み込む (MSBuild.exe のみ)
17.10
-
AppDomain 構成は BinFmt を使用せずにシリアル化されます。機能は、を編集して実行時に
MSBuild.runtimeconfig.jsonが許可されている場合にのみオプトアウトできます。 BinaryFormatter の使用は安全ではありません。 - .NET フレームワークでのシリアル化のカスタム イベントに関する既定の警告
- キャッシュ SDK リゾルバーのデータ プロセス全体
- ターゲット パラメーターは引用符で囲まれていないので、パラメーターターゲット名の ';' 記号は常に区切り記号として扱われます
- AssignLinkMetadata ターゲットのリソースにリンク メタデータを追加する
- バージョン切り替えの出力が改行で終わるように変更する
- NuGet.Framework をセカンダリ AppDomain に読み込む (MSBuild.exe のみ)
- 環境が変更されたときに特性を更新する
- Exec タスクで ConsoleOutput の先頭の空白文字がトリミングされない
- [MSBuild]::StableStringHash オーバーロードの導入
- 標準出力のエンコードを維持し、エラーを ToolTask のコンソール コード ページと一致させる
ローテーションから外れた変更ウェーブ
16.8
16.10
- 条件のプロパティ拡張に空白 がある場合にエラーが発生する
- TargetPath を使用して、CopyToOutputDirectory のカスタムロケーションを許可する
- exec を使用しているときに、ユーザー名に特定の特殊文字が含まれるユーザーが正常にビルドできるようにする
- SDK が解決できない場合に復元操作を失敗
- glob の評価を最適化する
17.0
- Scheduler は BuildParameters.DisableInprocNode を優先する必要があります
- .NET Framework で globbing 正規表現をコンパイルしない
- 既定でコンテンツ項目を推移的にコピーする
-
参照アセンブリが既定で
binディレクトリに配置されなくなった (こちらで元に戻され、こちらで復活) - デバッグ エクスペリエンスの向上: グローバル スイッチ MSBuildDebugEngine を追加します。BuildManager からバイナリ ロガーを挿入する。静的グラフを .dot ファイルとして印刷
- BuildManager と LoggingService のデッドロックを修正する
- ファイル ロガーとコンソール ロガーの の diag レベルを最適化する
- 最適化された変更できないファイルの最新状態チェック
- ディレクトリ列挙 に Microsoft.IO.Redist を追加する
- ToolsetConfigurationSection のプロセス全体のキャッシュ
- RAR 出力パスを正規化
17.4
- アセンブリ を読み込むときに deps.json を考慮する
-
Platform中に を既定として検討する - SDK マニフェストへの承認済み SDK 名の一致パターンの追加
- 無効なプロジェクトの種類を示す警告を発する
- MSBuild サーバー
17.6
- ターゲット で無効なプロパティを解析する
- プロジェクト文字列キャッシュの を削除する
- インポートの指定された検索パスが存在しない場合にエラーをログに記録
- ログ アセンブリの読み込み
- AnyHaveMetadataValue 関数は空のリストが渡された場合、false が返されます
- ログ項目の自己拡張
17.8
- [RAR] SDK で提供される参照に対して I/O を実行しない
- コピーする前にコピー先ファイルを削除
- ハッシュ タスク の SHA1 から SHA256 への移動の
-
カスタム派生 BuildEventArgs の非推奨化 - 機能をオプトアウトできるのは、BinaryFormatter が実行時に許可されるよう編集されている場合のみです
MSBuild.runtimeconfig.json
FAQ
変更ウェーブをローテーションから外す場合に他のすべてのリリースを対象とするのはなぜですか?
私たちは、影響を受けた人々と話し合い、変化に適応するのに十分な時間だと信じています。
プロジェクト プロパティではなく環境変数が必要な理由
MSBuild がプロジェクトを読み込む前に、変更ウェーブの下に機能を配置するシナリオがあります。 そのため、変更ウェーブでは環境変数を使用する必要があります。
オプトインではなくオプトアウトする理由はなんですか?
オプトアウトは Microsoft にとってより優れたアプローチです。それ以外の場合は、機能が顧客のビルドに影響を与えたときに限られたフィードバックを受け取る可能性があります。
関連コンテンツ
- MSBuild
- MSBuild 16 の新機能