4

何らかの理由で、ベータ テスター用に、コンパイル済みアセンブリ、構成ファイル、およびその他のさまざまなファイルをネットワーク共有に XCOPY するためのバッチ ファイルを作成するスクリプトがあります。インストーラーはありますが、インストーラーを実行するために必要な権限を持っていないものや、Citrix で実行しているものがあります。

XCOPY と Citrix についての言及でデスク全体に嘔吐した場合は、それを言い訳にして早く家に帰りましょう。どういたしまして。

コードには現在、次のような数百の行があります。

CreateScripts(basePath, "Client", outputDir, FileType.EXE | FileType.DLL | FileType.XML | FileType.CONFIG);

以前は、そのファイル タイプを出力ディレクトリにコピーするかどうかを表す 20 個の int パラメータ (ファイル タイプごとに 1 つ) があり、さらに悪化していました。

これらの数百の行は、数千の XCOPY 行を含むアップロード/ダウンロード バッチ ファイルを作成します。セットアップ プロジェクトでは、「クライアントからのプライマリ出力」や「クライアントからのコンテンツ ファイル」などを参照できます。セットアップ以外のプロジェクトからプログラムでそれを実行できるようにしたいのですが、途方に暮れています。

明らかに、MS は、API を使用するか、.csproj ファイルを解析することによってそれを行います。どうすればこれを行うことができますか?セットアップ カテゴリのいずれかのファイルのリストを取得する方法を探しています。

  • プライマリ出力
  • ローカライズされたリソース
  • コンテンツ ファイル
  • ドキュメント ファイル

編集:私はハスが提案したようなセットアッププロジェクトを持っています。それは私が探しているものの途中です。それが完璧な解決策ではない唯一の問題は、複数のプロジェクトが同じアセンブリが独自のフォルダーにあることに依存しており、セットアップでファイルが一度しかコピーされないことです。

例:

プロジェクト Admin、Client、および Server はすべて ExceptionHandler.dll に依存し、Admin と Client は両方とも Util.dll に依存しますが、Server は依存しません。これは私が探しているものです:

  • 管理者
    • 管理者.exe
    • Admin.exe.config
    • ExceptionHandler.dll
    • ユーティリティ.dll
  • クライアント
    • クライアント.exe
    • Client.exe.config
    • ExceptionHandler.dll
    • ユーティリティ.dll
  • サーバ
    • サーバー.exe
    • Server.exe.config
    • ExceptionHandler.dll

参照されているアセンブリはすべて同じであるため、次のようになります。

  • 管理者
    • 管理者.exe
    • Admin.exe.config
    • ExceptionHandler.dll
    • ユーティリティ.dll
  • クライアント
    • クライアント.exe
    • Client.exe.config
  • サーバ
    • サーバー.exe
    • Server.exe.config

これにより、クライアントまたはサーバーのいずれかが期待する 2 つの DLL のいずれかを見つけることができない場合、FileNotFoundException が発生します。

別のプロジェクトの出力で別の場所に複製されている場合でも、常に出力をコピーするようにするために欠落しているセットアップ プロパティはありますか?

EDIT AGAIN : 参照されるすべての DLL は「ローカルにコピー」に設定され、常に設定されています。NAnt と XSLT を使用してファイルのリストを取得することに関する適切な記事を見つけたので、neouser99 が提案したように、それも解決策になる可能性があります。

受け入れられた解決策: 私はほとんど出発点に戻っています。すべての .exe および .dll の出力は、セットアップ プロジェクトの "bin" ディレクトリに緩やかに圧縮されて配置されます。他のアプリケーションごとのフォルダーには、そのディレクトリ内の実行可能ファイルへのショートカットが含まれています。

ここでの違いは、カスタム アクションをインストーラーに追加してリフレクションを使用し、各実行可能出力の依存関係を列挙し、.exe ファイルと .dll ファイルを別のディレクトリにコピーすることです。いくつかのセットアップライブラリを介して含まれるファイルをプログラムで検出する方法があると思っていたので、少し面倒です。

4

5 に答える 5

1

別のセットアッププロジェクトを使用して、「パッケージファイル」設定を「緩い非圧縮ファイル」(セットアッププロジェクト->プロパティ)に設定してみませんか?次に、フォルダを共有します。

編集:

なるほど、出力用に3つのフォルダーがあります。ただし、セットアッププロジェクトはExceptionHandler.dllとUtil.dllを1回だけ検出するため、最初のフォルダーを選択してそこに配置します。

プロジェクトごとにセットアッププロジェクトを実行できます。少し面倒かもしれません。

同じソリューションにこれらのプロジェクトがある場合は、「ファイルの追加」または「アセンブリの追加」または「プロジェクト出力の追加」によってファイルを追加することにより、アセンブリが欠落しているプロジェクトにdllを手動で追加できます。しかし、それは事実ではないかと思います)。

または、それらすべてを1つの出力ディレクトリにダンプします...

于 2009-05-01T15:04:37.410 に答える
1

ビルドツールとして設計されていますが、NAntはあなたが話していることに非常に役立つと思うかもしれません。定義できるタスク(ビルド、コピー、移動、削除など)により、一般的な完全なフォルダーまで、非常にきめ細かいファイル検索が可能になります。NAntもビルドプロセスに組み込むと、1つよりも多くの点で役立つことがわかると思います。

于 2009-05-01T15:34:55.123 に答える
1

過去にうまくいったもう 1 つの方法は、共有リソース (アセンブリ、DLL、またはプロジェクト) を、管理、サーバー、およびクライアントの各プロジェクトへの参照として追加することです。次に、各プロジェクトの参照項目のプロパティ パネルを開き、[ローカルにコピー] を true に設定します。

プロジェクトをビルドすると、それぞれの出力フォルダーにコピーされたアセンブリの独自のインスタンスが作成されます。

これにより、この方法で追加された共有コンポーネントが、セットアップ パッケージの各出力フォルダーにレプリケートされるようになります。

于 2009-05-05T21:20:58.173 に答える
0

まったく異なるアプローチは、ネットワーク共有上のシンボリック リンクとしてそれらを設定することです。シンボリック リンクは、基本的に、ファイル システムがショートカットであるという事実を隠すショートカットであるため、他のすべてのアプリケーションは、ファイルがコピーされたと実際に認識します ( http://en.wikipedia.org/wiki/ NTFS_symbolic_link )。

このアプローチの利点の 1 つは、プロジェクトをビルドするときだけでなく、ファイルが変更されるとすぐにファイルが更新されることです。たとえば、構成ファイルの 1 つをテキスト エディターで保存すると、更新がすぐに適用されます。

于 2009-05-09T07:49:34.213 に答える
0

次の 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 をインストールする必要があると思います。

于 2009-05-10T19:57:33.497 に答える