syncProj-Visual Studio C ++プロジェクトを生成するためのユーティリティ

syncProjは、Visual Studio C ++プロジェクトを生成するためのユーティリティです。







こんにちは Visual Studio用のプロジェクトジェネレーターを作成した経験を共有したいと思います。







一般的に、これまで、私自身はpremake5を積極的に使用してきました。そして、原則としてそれを交換し続けますが、それでもpremake5の非ドッキングおよび直接バグに遭遇することがありました。 premake5の修復は特に熱心ではありませんでした。 premake5はスクリプト言語Luaに基づいており、これは独自のマナーとジョークを持つ別のプログラミング言語です。 私たちの会社はC ++とC#に支配されているので、新しいものを試して、簡潔で洗練されたものにしようと考えました。







ある時点で、私はC#を試し、問題なくC#をコンパイルしてスクリプトのように実行できることを知っていました。







最初にソリューション(.sln)ファイル形式を掘り下げ、次にC ++プロジェクトファイル形式(.vcxproj)を掘り出しました。原則として、それらについて特別なものはなく、データだけがありました。 マイクロソフトはおそらくファイル形式のデータをどこにも公式に公開していないため、情報を部分的に検索し、部分的にリバースエンジニアリングする必要がありました。







.vcxprojプロジェクトのある種のクラスモデルをスケッチする必要がありました-モデル自体は現在、最適なモデルではなく.vcxprojに非常に近いですが、ソリューションとプロジェクトの両方をロードする方が簡単です-すべては半手動で、部分的にC#リフレクションによってロードされます。









ただし、最も単純なスクリプトから始めましょう。







test.cs: //css_ref syncproj.exe using System; partial class Builder : SolutionProjectBuilder { static void Main(String[] args) { solution("out_test"); platforms("Win32", "x64", "ARM", "ARM64"); project("out_test_windows"); platforms("Win32", "x64"); files("test.c"); filter("Debug"); defines("_DEBUG"); filter("Release"); defines("NDEBUG"); } //Main }; //class Builder
      
      





premake5構文に固執せず、同様の関数を作成する理由を考えました。したがって、premake5で{” _DEBUG”}を定義している場合、syncProjでこれは関数呼び出しです-define(” _DEBUG”);







私は絶対的な最小値を維持しようとしたので、syncProjはそれ以上何もしません。







原則として、syncProjが普及するかどうか、コミュニティのサポートがあるかどうかなどはわかりません。そのため、将来の計画を立てて、ユーティリティをシンプルかつ最小限にしたくありませんでした。 途中で関数を追加しましたが、最も必要とは考えていませんが、たとえばC#(.csproj)はサポートを追加しませんでした(ただし、これは難しくありません)。







ほとんどすぐに、開発はC#スクリプトを中心に展開され、Visual Studioでスクリプト自体をデバッグできるようになりました。







[ツール]> [拡張機能と更新]のオンラインギャラリーには、プロジェクトを作成せずにC#スクリプトをデバッグできる「CSスクリプトツール」があります。







// css_ref、// css_includeなどのタグはC#スクリプトから直接取得され、私自身は正規表現を介してサポートを行いました。







当然、コマンドラインを使用すると、プロジェクトは次のように生成されます。







> syncproj.exe test.cs







test.cs:







3ファイルが更新されました







ユーティリティを互いに比較すると、cmakeはCMakeLists.txtでcmake自体が起動されるカスタムビルドアクションも生成します。 premake5では、これは自動的には行われませんが、カスタムビルドステップの定義を通じて同じことを書くことができます。 syncProjでは、このための特別なコマンドを作成しました。たとえば、projectScript(” test.cs); このカスタムビルドステップを構成します。







画像



たとえば、1つの.csスクリプトがtest.csとhelpers.csの2つのファイルに分かれている場合に発生する最も興味深いことは、test.csがcss_includeを介してhelpers.csを指す場合、原則として、少なくとも1つを変更する場合は、プロジェクトを再生成する必要があります。 現時点では、これは追加の依存関係を介して行われますが、ユーザーが両方のスクリプトに対してprojectScriptを2回記述することを妨げるものはありません。 たとえば、プロジェクトを変更したらすぐにCtrl + F7でプロジェクトを生成すると非常に便利です。







テスト。







私が理解しているように、今日のプログラマーはテストせずにソフトウェアを作るのは本当に好きではありません。 複雑なコードの場合、何も壊れないことを何らかの形で追跡する必要があります。 一方で、それらを理解し、他方では、それは実際に各テストケースを調べたいという欲求ではありません。 一般的に、私は考え、考え、そして単体テストを簡単にサポートしました。







最初はプロジェクトがテストされたばかりでしたが、コードカバレッジを測定する必要もあったため、コードカバレッジを測定するために[TestMethod](1つの方法)でテストを実行できるようにテストを少し更新しました。 現時点では、すべてのバフと改善でコードカバレッジを増やす計画があります。 最後のコミットでは、81.13%でしたが、これはコミット履歴で追跡できます。コメントでマークします(cc:81.13%)。







それでも、1つのメソッドをテストして、多くの関数をテストする方法をどのように作成できるのでしょうか?







主なアイデアは、通常、テストアプリケーションで何らかの種類のテスト関数を作成する場合、syncProjユーティリティ自体のテスト関数を取り出し、別のファイル(たとえば、NoProjectSelected.cs)として保存し、コンソールアプリケーションから出力を書き込むためのメカニズムも追加することです。







コマンドラインで期待どおりにNoProjectSelected.csを実行するとしましょう:







> syncProj.exe NoProjectSelected.cs







syncProjはこれを出力します。







NoProjectSelected.cs:







NoProjectSelected.cs(10,13):エラー:プロジェクトが指定されていません(プロジェクト(「名前」を使用して新しいプロジェクトを指定してください))







印刷されるのは、テストの結果のみです。 テスト結果は別のファイルに保存されます。 開発の時点で、プログラマーはプログラムが何を印刷すべきかを知っており、それを承認するかどうかを決定します。 もう1つのオプションは、これが新しいテストである場合です。







その結果、NoProjectSelected.csが新しいテストである場合、syncProjテストは以下を生成します。







画像



テスト結果がすでに利用可能であるが異なる場合、メッセージはほぼ同じです。







画像



[はい]を選択すると、ユーティリティが画面に印刷した内容を含むNoProjectSelected.cs.accepted_log.txtファイルが作成されます。







[いいえ]を選択すると、通常のテキストファイルを比較するプログラムが起動します。 (たとえば、WinMerge)







もちろん、大量のリファクタリングが発生した場合、プログラマは新しいテスト結果を「承認」するだけです。







最小限のテストコストで、最大限の結果が得られます。







まあ、基本的にはすべて-C#スクリプトはプロジェクトを作成するためのかなり柔軟なアプローチを可能にしていると思います-つまり プロジェクトが複雑になると、C#スクリプト自体がより複雑になります-関数が表示され、ヘルパーが表示されます。







例として、これを表示できます。 プラグインプロジェクトが既に機能付きで作成されている場合。







はい、私は知っています、cmakeとpremakeは関数を書くこともできますが、それをデバッグする方法はありません。







syncProjはこれまでのところWindowsでのみ機能し、Visual Studioプロジェクトのみが認識されますが、これまでのところ、他の場所に移植する必要はありません。 私はコードを理想に近づけようとしました-完全にコメントアウトされているので、私の仕事を続ける熱狂者がいるなら、私はあなたを最新の状態に満足させます。







はい、syncProjはVisual Studioとフレンドです。そのため、エラーが発生した場合、エラーが発生した行をダブルクリックし、コードを修正する必要がある場所に移動できます。 はい、それで十分でない場合は、C#スクリプトツール、およびデバッグを行います。







コード







ドキュメント







何か修正が必要な場合は、エラーをプロキシに報告してください-はい、syncProj自体の開発に参加できます。







プロジェクトの著者:Tarmo Pikaro、tapika-(at)-yahoo-dot-com








All Articles