各 MVC バージョンと各 .NET バージョンのコードのバージョンを出力する必要がある Nuget パッケージを作成しています。ただし、明らかに保守性の理由から、同じソース ファイルで条件付きコンパイル定数を使用することにしました。
私がやりたいことは、適切なロジックを使用してコンパイル定数で囲まれたすべてのセクションを置き換える方法を見つけて、適切なコードだけが残るようにすることです。例えば:
var alwaysExists = 1;
#if !MVC2
this.For<System.Web.Mvc.IFilterProvider>()
.Singleton()
.Use<FilterProvider>();
#endif
#if NET35
var someVariable = 100;
#else
var someVariable = 200;
#endif
上記のコード ブロックで、渡されたシンボルMVC4, NET40
が
var alwaysExists = 1;
this.For<System.Web.Mvc.IFilterProvider>()
.Singleton()
.Use<FilterProvider>();
var someVariable = 200;
渡されたシンボルが のMVC2, NET35
場合、テキスト ファイルは
var alwaysExists = 1;
var someVariable = 100;
メソッドは、 などのロジックのすべてのメソッドをサポートする必要がありますif, else, if !
。.cs (テキスト) ファイルの入力と .cs (テキスト) ファイルの出力が必要です。
正規表現といくつかのカスタム コードを使用してこれを潜在的に達成する方法を考えましたが、その道を進む前に、もっと簡単な方法があるかどうかを確認したいと考えていました。
コマンド ライン ユーティリティ、ライブラリ、またはこれを既に実行できる .NET フレームワークに組み込まれているものはありますか?
明確化
コンパイルされたアセンブリではなく、Nuget を使用してターゲット プロジェクトにコード ファイルをデプロイする方法を探しています。条件付きコンパイル シンボルをターゲット プロジェクトに展開する必要はありませんが (可能ですが)、代わりにすべての条件付きコンパイル ロジックをコードから除外し、ロジックを処理して、コンパイラが提供するものと同等のコード ファイルを生成します。シンボルで行います。これは構成としてのコードであり、ターゲット プロジェクトには .NET と MVC の組み合わせが 1 つしか必要ありません。シンボルを展開するだけでなく、物事が複雑になりすぎます。MVC と .NET のバージョンの組み合わせごとにコード ファイルを手動で作成して維持する必要はなく、代わりに条件付きコンパイル シンボルを処理して、同じファイル セットを生成するようにしています。
答え
http://mcpp.sourceforge.net/download.htmlから C++ プリプロセッサをダウンロードし、次のコマンドを使用しました。
mcpp -C -P -DMVC2 -DNET35 Input.cs Output.cs
ドキュメントが示唆するように = を使用しなかったことに注意してください。
唯一の実際の制限は、コードに #region ステートメントがある場合、コマンドがクラッシュすることです。それらを省略することで、これを回避できました。また、コードのフォーマットを少し台無しにしましたが、それでもコンパイル可能な状態に保っていました。