web-dev-qa-db-ja.com

Wix-インストールフォルダーにディレクトリをコピーする方法

プロジェクトに多くのファイルを含むBinフォルダーがあります。今のところ、以下のコードを使用して、特定のファイルをインストールフォルダーに追加する方法を知っています。

<File Source='$(var.Debug)Myapplication.exe' Id='file4028276A0CAD84E3BDE449237AE31A5F' />  

ただし、ディレクトリ全体をインストールパスに移動したいと考えています。たとえば、フォルダ「Bin」全体をインストールパス「C:\ Myapplication」に移動します。

どうしたらいいですか?

前もって感謝します!

20
Jack He

wixインストーラーに大きなディレクトリツリーを含める方法

これはよさそうだ。しかし、行うにはあまりにも多くの仕事。

wixでフォルダをコピーする方法

上記のリンクはうまくいきました。ただし、サブフォルダはコピーできません。

だから私がしたことは、フォルダー全体を読み取り、そのサブディレクトリとファイルを取得し、必要なコードブロックを生成するアプリを作成しました

 <Component Id="myfile" Guid="GUID">
     <File Id="myfile.txt" Source="MySourceFiles\myfile.txt" KeyPath="yes" Checksum="yes"/>
 </Component>

次に、生成されたコードブロックを.wxsファイルに追加しました。

このアプリの作成に費やす最初の時間は無駄ではありません。いつまでも使い続けることができるから。ファイルごとにコピーすることをお勧めします。アップグレードまたは修復時に役立ちます。 MSIは、コピーされるファイルごとにレコードを保持します。そのため、アップグレードや修理の際に保守可能で便利です。

3
LeoN

使用したいように聞こえるのは、WiXツールheatです。これは、ディレクトリ(または個々のファイル)を「収集」して、プロジェクトで使用できるWiXフラグメントファイルを作成するために使用されます。

たとえば、ハーベスティングしたいディレクトリがあり、サブディレクトリが含まれている場合がありますが、ファイルがたくさんあり、すべてを必要としています... Heatがそれを行います。

この簡単な構造を考えてみましょう:

Somedir
    |
    |---A file.txt
    |---An init file.ini
    |---another file.txt
    |---subfolder
            |
            |---a subfolder file.txt

このディレクトリを取得するために熱を使用する場合、ツールはフラグメントファイルを生成します。これは、ファイルを一度に1つずつ指定したり、回避策のソリューションを使用したりすることなく、プロジェクトのコンポーネント参照として使用できます。

たとえば、次のHeatコマンドはこのディレクトリを処理します(この例では1レベル上)

heat dir somedir -o MyHarvestedStuff.wxs -scom -frag -srd -sreg -gg -cg MyComponentGroupId -dr BIN_DIR_REF

どこ:

dir = harvest a directory
somedir = directory you want to harvest
-o MyHarvestedStuff.wxs = the output fragment file
-scom -sfrag -srd -sreg = Suppress COM elements, fragments, root directory as element, registry harvesting (these options will create a grouping that most applications can use)
-gg = generate GUID's now (this will put the GUID's into your output file, rather than using a wildcard "*". The advantage here is you can use non-standard TARGETDIR, which would not qualify for autogenerated GUID's)
-cg MyComponentGroupId = component group. this is what you will use in your feature set to include these files
-dr BIN_DIR_REF = this is the directory reference for which to place the files in your final package.

結果のXMLは次のようになります(これは、実際のGUIDの投稿を避けるために-ggなしで実行されました)

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.Microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="BIN_DIR_REF">
            <Directory Id="dirF065D7446868E03DB0B296EBADA4E4A1" Name="subfolder" />
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="MyComponentGroupId">
            <Component Id="cmp739547000B47E975B0452D876AF7810B" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
                <File Id="fil09B311A6D1EABD9E94DFA5C83F59C548" KeyPath="yes" Source="SourceDir\A file.txt" />
            </Component>
            <Component Id="cmp84C8400F892D39B05EE3021CCEEAA14F" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
                <File Id="fil11A22646343997D26AC54171A62DFF4C" KeyPath="yes" Source="SourceDir\an init file.ini" />
            </Component>
            <Component Id="cmpFA266FC6F3269CB5D9E42C38FC995117" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
                <File Id="filA545B6E4B63B8211E982917FC78F6EB4" KeyPath="yes" Source="SourceDir\another file.txt" />
            </Component>
            <Component Id="cmp2EC5C1618A59F47B7BDE800EB9AA8688" Directory="dirF065D7446868E03DB0B296EBADA4E4A1" Guid="PUT-GUID-HERE">
                <File Id="filB0CD0B02385137DC806112E293083459" KeyPath="yes" Source="SourceDir\subfolder\a subfolder file.txt" />
            </Component>
        </ComponentGroup>
    </Fragment>
</Wix>

プロジェクトファイルでは、ルート<Directory>要素の下に次のようなものがあります。

<Directory Id="BIN_DIR_REF" Name="bin">
    <!-- anything else you might put here...-->
</Directory>

そしてあなたの機能グループで:

<Feature Id="Complete" Level="1">
    ...
    <ComponentGroupRef Id="MyComponentGroupId" />         
    ...
</Feature>

すべてをまとめる...

  1. 新しいフラグメントファイルを他のファイルと一緒にcandleに提供します
  2. candleが生成する.wixobjファイルをlightに提供します
  3. 新しいフラグメントファイルのSourceDir参照を、WiXプリプロセッサ変数または-bオプションを使用してlightに解決します。

    例:light ... -b "path to my directory that I harvested" ...

回答の長さがこのソリューションの探索を妨げないようにしてください。非常にうまく機能し、非常に簡単です。ここで、そのディレクトリから何かを除外したい場合、それはwhole他のストーリーです...

67
Ryan J