プログラムによるコンテンツファイルとプライマリ出力の取得
-
03-07-2019 - |
質問
何らかの理由で、コンパイル済みアセンブリ、構成ファイル、およびその他のさまざまなファイルをベータテスター用のネットワーク共有にXCOPYするバッチファイルを作成するスクリプトがあります。インストーラーはありますが、インストーラーを実行するために必要な権限を持っていないか、Citrix上で実行されています。
XCOPYとCitrixについての言及でデスク全体で嘔吐した場合は、それを口実として使用して、早く家に帰ってください。どういたしまして。
現在、コードには次のような数百行があります:
CreateScripts(basePath, "Client", outputDir, FileType.EXE | FileType.DLL | FileType.XML | FileType.CONFIG);
以前はさらに悪く、20個のintパラメータ(ファイルタイプごとに1つ)がそのファイルタイプを出力ディレクトリにコピーするかどうかを表していました。
これらの数百の行は、数千のXCOPY行を持つアップロード/ダウンロードバッチファイルを作成します。セットアッププロジェクトでは、「クライアントからのプライマリ出力」などを参照できます。および「クライアントからのコンテンツファイル」。セットアップ以外のプロジェクトからプログラムでそれを行えるようにしたいのですが、迷っています。
明らかに、MSはAPIを使用するか、.csprojファイルを解析することにより、それを行います。これをどうやってやるの?私は、セットアップカテゴリのいずれかのファイルのリストを取得する方法を探しています、つまり:
- プライマリ出力
- ローカライズされたリソース
- コンテンツファイル
- ドキュメントファイル
編集: Hathが提案したセットアッププロジェクトがあり、それは私が探しているものの中間です。それが完璧なソリューションであることを妨げる唯一の問題は、複数のプロジェクトが独自のフォルダーにある同じアセンブリに依存していることであり、セットアップはファイルを一度だけコピーします。
例:
Projects Admin、Client、およびServerはすべてExceptionHandler.dllに依存しており、AdminとClientは両方ともUtil.dllに依存していますが、Serverは依存していません。これは私が探しているものです:
- 管理者
- Admin.exe
- Admin.exe.config
- ExceptionHandler.dll
- Util.dll
- クライアント
- Client.exe
- Client.exe.config
- ExceptionHandler.dll
- Util.dll
- サーバー
- Server.exe
- Server.exe.config
- ExceptionHandler.dll
参照されるアセンブリはすべて同じであるため、私が得るのはこれです:
- 管理者
- Admin.exe
- Admin.exe.config
- ExceptionHandler.dll
- Util.dll
- クライアント
- Client.exe
- Client.exe.config
- サーバー
- Server.exe
- Server.exe.config
これにより、クライアントまたはサーバーのいずれかが予期している2つのDLLのいずれかを検出できない場合、FileNotFoundExceptionが発生します。
他のプロジェクトの出力の他の場所に複製されていても、常に出力をコピーするために設定プロパティがありませんか?
再度編集:参照されるすべてのDLLは「ローカルにコピー」に設定され、常に変更されています。 NAntとXSLTを使用してファイルのリストを取得するに関するまともな記事を見つけました。 neouser99が提案したように、これも可能な解決策かもしれません。
承認された解決策:私は始めたところからかなり戻ってきました。すべての.exeおよび.dll出力は「bin」に入れられます。セットアッププロジェクトのディレクトリ。大まかにパックされています。他のアプリケーションごとのフォルダーには、そのディレクトリ内の実行可能ファイルへのショートカットが含まれています。
ここでの違いは、カスタムアクションをインストーラーに追加してリフレクションを使用し、各実行可能出力の依存関係を列挙し、.exeファイルと.dllファイルを別々のディレクトリにコピーすることです。少し苦労しました。セットアップライブラリを介してどのファイルが含まれるかをプログラムで検出する方法があると思いました。
解決
別のセットアッププロジェクトを使用せず、「パッケージファイル」の設定を「As Loose uncompressed files(setup project-> properties)」に設定するのはなぜですか?次に、フォルダを共有します..または何か。
編集:
なるほど、出力用に3つのフォルダーがあります。ただし、セットアッププロジェクトはExceptionHandler.dllとUtil.dllを一度しか検出しないため、最初のフォルダーを選択してそこに配置するだけです。
各プロジェクトのセットアッププロジェクトを実行できます-少し面倒かもしれません。
dllをアセンブリのないプロジェクトに手動で追加できます 同じソリューションにこれらのプロジェクトがある場合は、「ファイルの追加」または「アセンブリの追加」または「プロジェクト出力の追加」によってファイルを追加します。(そうではありませんが)。
またはそれらすべてを1つの出力ディレクトリにダンプする...
他のヒント
ビルドツールとして設計されていますが、 NAnt は非常に便利です。について話す。定義できるタスク(ビルド、コピー、移動、削除など)では、一般的なフルフォルダーまで、非常にきめ細かいファイルルックアップが可能です。 NAntをビルドプロセスに組み込む場合は、NAntが1つよりも多くの点で役立つことがわかると思います。
過去に私のために働いていた別のアプローチは、管理者、サーバー、クライアントの各プロジェクトへの参照として共有リソース(アセンブリ、DLL、またはプロジェクト)を追加することです。次に、各プロジェクトの参照アイテムのプロパティパネルを開き、「ローカルにコピー」を設定します。真に。
プロジェクトをビルドすると、それぞれのアセンブリの独自のインスタンスが出力フォルダーにコピーされます。
これにより、この方法で追加された共有コンポーネントが、セットアップパッケージの各出力フォルダーに複製されます。
まったく異なるアプローチとして、ネットワーク共有上のシンボリックリンクとして設定する方法があります。シンボリックリンクは基本的にショートカットであり、ファイルシステムはショートカットであるという事実を隠しているため、他のすべてのアプリケーションは、ファイルがコピーされたと実際に信じています( http://en.wikipedia.org/wiki/NTFS_symbolic_link )。
このアプローチの利点の1つは、プロジェクトをビルドしたときだけでなく、ファイルが変更されるとすぐにファイルが更新されることです。したがって、たとえば、config-filesの1つをテキストエディターで保存すると、更新がすぐに適用されます。
次のMSBuildスクリプトパーツはSLNファイルをビルドでき(.csprojに置き換えることができます)、ビルドされたすべてのプロジェクト(Dll、EXE)のリストを報告します。
<MSBuild Projects="MySolution.sln" Targets="Clean; Rebuild" Properties="Configuration=$(BuildMode);">
<Output TaskParameter="TargetOutputs"
ItemName="AssembliesBuilt" />
</MSBuild>
現在、これは実際には問題を解決しませんが、ビルドされたすべてのリストを取得します。 copylocalもあるので、おそらくAssembiesBuildを使用して、そこからすべてのDLLおよび.CONFIGファイルをコピーできます。
例:
AssembliesBuild = c:\ myproj \ something1 \ build.dll
c:\ myproj \ something1 \に移動して、すべての* .dllおよび* .configファイルを検索し、それらを含めます。 MSBuildまたはpowershellがインストールされていれば、これを非常に簡単に実行できます。 MSBuildからXCOPYスクリプトを出力するには、MSBuild contrib projctがインストールされている必要があると思います。