2009-05-01 9 views
4

なんらかの理由で、私たちはベータテスターのためにコンパイルされたアセンブリ、設定ファイル、およびその他のさまざまなファイルをネットワーク共有にXCOPYするバッチファイルを作成するスクリプトを用意しています。私たちはインストーラを持っていますが、インストーラを実行するのに必要な権限を持っていないものやCitrix上で実行しているものがあります。コンテンツファイルとプライマリ出力の取得

あなたがXCOPYとCitrixの言葉であなたの机の上をすべて嘔吐したら、早めに家に帰る言い訳としてそれを使用してください。どういたしまして。

コードは、現在のような行数百有する:それは、出力ディレクトリに、そのファイルの種類をコピーするか否かを示す20個のint型のパラメータ(ファイルの種類ごとに)で、悪化するために使用

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

を。

何百もの行が、何千ものXCOPY行を含むアップロード/ダウンロードバッチファイルを作成します。セットアッププロジェクトでは、「クライアントからのプライマリ出力」や「クライアントからのコンテンツファイル」のようなものを参照できます。私はプログラムではないセットアッププロジェクトからそれを行うことができればと思っていますが、私は迷っています。

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

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

編集: 私はHathのようなセットアッププロジェクトを持っていますが、これは私が探しているものの半分です。完全な解決策ではないという唯一の問題は、複数のプロジェクトが同じアセンブリに依存していることです。セットアップでは、そのファイルを一度しかコピーしません。

例:

プロジェクト管理、クライアント、およびサーバーのすべてがExceptionHandler.dllに依存している、とServerはそうではない管理者とクライアントの両方が、Util.dllに依存しています。

    • た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

      参照されるアセンブリがすべて同じであるため、どのようなI取得する:

      • 管理
        • たAdmin.exe
        • Admin.exe.config
        • ExceptionHandler.dll
        • Util.dll
      • クライアント
        • CLIENT.EXE
        • Client.exe.config
      • サーバー
        • Server.exeが
        • Server.exe.config

      、クライアントまたはサーバは、2つのDLLのいずれかを見つけることができないとき、これはFileNotFoundExceptionをを引き起こしそれは期待している。

      別のプロジェクトの出力の別の場所に重複している場合でも、出力をコピーするために設定が失われていますか?

      EDIT AGAIN:参照されているすべてのDLLは、「ローカルコピー」に設定されています。私はusing NAnt and XSLT to grab the list of filesでまともな記事を見つけたので、可能な解決策でもあります。

      受諾された解決策:私が始めた場所に戻っています。すべての.exeと.dllの出力は、セットアッププロジェクトの "bin"ディレクトリに格納されます。他のアプリケーションごとのフォルダには、そのディレクトリ内の実行可能ファイルへのショートカットが含まれています。

      違いは、反映を使用し、実行可能ファイルごとに依存関係を列挙し、.exeファイルと.dllファイルを別々のディレクトリにコピーするように、カスタムアクションをインストーラーに追加するつもりです。ちょっとした痛みです。私はちょうど、セットアップライブラリを介してどのファイルがインクルードされるのかをプログラマチックに検出する方法があると仮定しました。

      もう一度お手伝いをしてください。

  • 答えて

    1

    他のセットアッププロジェクトを使用せず、[パッケージファイル]設定を[非圧縮ファイルとして(セットアッププロジェクト - >プロパティ)]に設定するだけですか?フォルダを共有してください。

    編集:

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

    あなたはプロジェクトごとにセットアッププロジェクトを行うことができます - ビット迷惑かもしれない...

    を手動で「追加のファイル」で、ファイルに追加することによって、アセンブリの のいずれかが欠落しているプロジェクトにDLL年代に追加することができます同じソリューションにこれらのプロジェクトがある場合は、「アセンブリの追加」または「プロジェクト出力の追加」を選択します(ただし、そうは思われません)。それはビルド・ツールとして設計されていますが、

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

    +0

    部分的に動作します。私は今実行している問題で質問を更新しました。 –

    1

    、あなたが話しているものに非常に有用であることがNAntを見つけるかもしれません。定義できるタスク(ビルド、コピー、移動、削除など)は、非常にきめ細かなファイルルックアップ(一般的なフルフォルダまで)を可能にします。あなたがNAntをあなたのビルドプロセスに組み込んでいるなら、あなたはもっと多くの点でそれを助けることができると思います。

    +0

    コンテンツファイルまたはプロジェクト出力を具体的に取得する方法の参考文献または例がありますか?私はそれについて上品な記事を見つけた、私は元の投稿に追加しました。 –

    1

    過去に私が働いていたもう1つのアプローチは、Admin、Server、およびClientの各プロジェクトへの参照として共有リソース(アセンブリ、DLLまたはプロジェクト)を追加することです。次に、各プロジェクトの参照項目のプロパティパネルを開き、 "ローカルコピー"をtrueに設定します。

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

    このようにして追加された共有コンポーネントは、セットアップパッケージの各出力フォルダにも複製されるはずです。

    +0

    これらはすべて「ローカルコピー」に設定されています。これが現在のXCOPYソリューションの仕組みです。残念ながら、セットアッププロジェクトは既存の共有依存関係を検出するので、2番目のフォルダにはコピーされません。 –

    0

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

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

    0

    次のMSBuildスクリプトパートは、SLNファイル(.csprojに置き換えることができます)をビルドし、ビルドされたすべてのプロジェクト(Dlls、EXEs)のリストを報告します。

    <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がインストールされている必要があります。