4

アプリ用の Wix インストーラーを作成しようとしています。Wix プロジェクトのハーベストは、メインの exe ファイルをインストール ディレクトリにコピーするだけで、すべての dll などはコピーされないため、機能しません。

そこで、アプリをビルドして Wix からの出力を使用するビルド前イベントを開催することを考えていました。

問題は、出力に .pdb、vchost.exe などのファイルが含まれることです。必要なファイルのみを出力するようにビルドを構成できますか?

編集: 最終的な解決策はここにあり ます https://github.com/AndersMalmgren/FreePIE/blob/master/BuildTools

https://github.com/AndersMalmgren/FreePIE/blob/master/BuildTools/build_installer.batを調べることから始め ます

4

1 に答える 1

7

プロジェクト用にインストーラー/zip ファイルなどを作成する場合、Visual Studio の「標準」ビルド、つまり.csprojファイル内では決して作成しません。
(ビルド前のイベントを配置しようとしている場所だと理解しています - 正しいですか?)
その理由は、プログラミング中に実行するすべてのビルドでインストーラー/zip を再構築したくないからです。

私が常に行っていること:エクスプローラーから(通常はバッチ ファイルを介して)手動で実行できるMSBuild プロジェクト ファイル
を作成します。これにより、Visual Studio ソリューションがコンパイルされ、zip ファイル、インストーラー、NuGet パッケージなど、必要なものがすべて作成されます。 したがって、セットアップの作成は完全に Visual Studio ソリューションから外れていますが、ソース管理から最新の変更を取得してすべてをビルドし、1 回のクリックでセットアップを作成できます。( Joel Test、2 番目の質問: 「1 つのステップでビルドを作成できますか?」)

Visual Studio が出力フォルダーに入れるすべてのものを必要としない場合は、最初に必要なファイルを別のフォルダーにコピーするだけです。

以下は、私のプロジェクトの 1 つの例です。

  1. MSBuild ファイル
    最後の段落 (「ファイルをリリース フォルダーにコピーする」) は、フォルダーの内容(およびファイル\bin\Releaseを除く) といくつかのファイルをルート フォルダーから別の「リリース」ディレクトリにコピーします。*.pdb*.xml

     <!-- copy files to release folder -->
     <Target Name="CopyRelease">
             <MakeDir Directories="$(ReleaseDir)"/>
             <ItemGroup>
                     <ReleaseFiles
                             Include="$(OutDir)\**\*.*;
                                     README.md;
                                     License.rtf"
                             Exclude="$(OutDir)\*.pdb;
                                     $(OutDir)\*.xml">
                     </ReleaseFiles>
             </ItemGroup>
             <Copy SourceFiles="@(ReleaseFiles)" DestinationFiles="@(ReleaseFiles -> '$(ReleaseDir)\%(RecursiveDir)%(Filename)%(Extension)')"/>
    
     </Target>
    
  2. MSBuild ファイルの実行に使用する
    バッチ ファイル(バージョン番号などを処理するため)バッチ ファイルにはさらに多くのコードがありますが、MSBuildファイルを実行する重要な部分は次のとおりです。

     rem path to msbuild.exe
     path=%path%;%windir%\Microsoft.net\Framework\v4.0.30319
    
     rem go to current folder
     cd %~dp0
    
     msbuild build.proj
    

私は実際に WiX を使用してこのプロジェクトのインストーラーをビルドしていますが、あなたが使用している「ハーベスト」機能は使用していません (以前は知りませんでした)。WiX プロジェクト ファイル
で インストーラーのすべてのファイルを指定するだけで、別のバッチ ファイルを使用してプロジェクトをビルドし(上記の最初のバッチ ファイルを呼び出して)、次に WiX セットアップを実行します。

私の実際の WiX ツールの使用方法があなたの使用方法と異なっていても、上記で説明したのと同様の方法を使用して、WiX の収穫機能用の「ソース フォルダー」を作成
できます。必要なファイルを正確にコピーするバッチ ファイルを呼び出します。別のフォルダーを作成し、それをソースとして使用してインストーラーを作成します。
MSBuild ファイルを作成したくない場合は、Robocopyなどを使用することもできます (完全なフォルダーをミラーリングできますが、特定のファイル拡張子を除外できます)。


編集:

  1. 1 つのプロジェクトだけでなく、完全なソリューションを構築してみてください。
    ファイルがあるフォルダーに、次の内容のバッチ ファイルを配置します.sln

     set PATH=%PATH%;%WINDIR%\Microsoft.Net\Framework64\v4.0.30319
    
     rem go to current folder
     cd %~dp0
    
     msbuild YourSolution.sln /p:Configuration=Release
    
  2. 2 番目のエラーは、PreBuildEvent target
    -> のビルド前イベントに既に何かを入れています.csprojか? うまくいかないかもしれません。


EDIT2:

私は似たようなことをしています:バージョン番号 (私の場合はハードコードされています) を環境変数に入れるバッチ ファイルがあり、実際のビルドを行う前にメイン ビルド バッチからそのバッチ ファイル
呼び出します
.csprojの には、アセンブリのバージョン番号が存在する場合は環境変数の値に設定するビルド前イベント0.0があり、それ以外の場合は.
(Visual Studio からビルドする場合、バージョン番号は気にしません。バッチ ファイルを使用してすべてのリリース ビルドを作成するため、バージョン番号のみが必要です)


編集3:

最後のステップでは、出力全体を Wix に取得します。各ファイルをリンクしますが、これは mu プロジェクトでは実用的ではありません。そのいくつかのサブフォルダーと何千ものファイル。wix で出力フォルダー全体をリンクする方法について何か良いアイデアはありますか?

申し訳ありませんが、私は前にこれを試したことはありません。WiX を使用する正しい方法は、セットアップを最初から段階的に構築することでした。

リンクからの引用(私による強調):

もちろん、これらの数百または数千のコンポーネントをすべて WiX ソース ファイルに入力すると、別の課題が生じます。ツールセットには、 これに役立つ小さなユーティリティがあります (詳細は後述) が、実際の解決策は概念の変更です。メインアプリケーションがすでに完成しているのに、セットアッププログラムを急いで書かなければならない別のアプリケーションと考えるのはやめてください。WiX ソース ファイルとツールセット自体は開発環境に簡単に統合できるため、常に同期しておく必要があります。新しいモジュールの作業を開始するか、プログラムに新しいレジストリ参照を追加するとすぐに、対応する WiX ソース ファイルを同時に変更します。このようにして、アプリケーション自体と一緒にセットアップが完了し、後でインストールに必要なすべてのファイルやその他の情報を抽出する必要がなくなります。WiX プロジェクトはモジュール化できるため (これについては後で詳しく説明します)、このアプローチは、1 人の開発者ではなく大規模なチームがアプリケーションに取り組んでいる場合にも同様に機能します。

引用されたテキストのリンクは、ツールを説明するページを指していますHeat。これは、以前に言及した「収穫」ツールのようで、すでに成功していません。

于 2013-02-09T22:18:07.807 に答える