2017年11月6日月曜日

dotNetInstallerによるシンプルBootstarpper作成

前回で多言語対応のmsiを作成したので、コマンドラインオプションを設定してmsi起動するBootstarpper作りを試みた。

本格的なものを作るならWiXのBurnを用いてBundleを作ることができるが、その場合はUIをBundle側のBootstrapperに移し、msiはBootstrapperの設定にしたがってUIなしで実行するのが本道のようだ。となると、せっかくmsiを多国語対応した意味がなくなるので
、このmsiを利用するシンプルなBootstarpperを作りを試みた。

ちなみにWiXでmsiにActionを追加することができるが、これはmsiが起動したあとで使われるので、起動時の言語切り替えには使えなかった。

まずはmsiとは別のexeを作り、そこからWindowsのCulture設定に従いmsiを起動する方法。例えば次のようなコードでコンソールアプリを作ればよい。

static void Main(string[] args)
{
    FileInfo msiFileInfo = new FileInfo(Directory.GetParent(Assembly.GetExecutingAssembly().Location) + "\\MyAppSetup.msi");
    if (!CultureInfo.Exists) {

    if (CultureInfo.CurrentCulture.Name == "ja-JP")
    {
        System.Diagnostics.Process.Start(msiFileInfo.FullName, "TRANSFORMS=\":ja-JP.mst\"");
    }
    else
    {
        System.Diagnostics.Process.Start(msiFileInfo.FullName);
    }
}

この方法の問題点はmsiとexeの二つが存在し、msiを直接起動することもできてしまうことだ。言語切り替えだけであれば実質的な問題はないとも言えるが、できれば一本化したい。

dotNetInstaller 

探してみたところ dotNetInstaller というオープンソフトがあった。公式ページではV2.3(Windows8対応)までだが、GitHubからはV2.4(Window10 対応)をダウンロードできる。

dotNetInstallerダウンロード
git.hubサイト (dotNetInstaller 2.4
dotNetInstaller公式サイト

dotNetInstallerも本格的なインストーラ作成に対応しているが、ここでは単に言語切り替えを実現するだけ。dotNetInstallerの設定でmsiをsetup.exeに組み込みこむ。setup.exe実行で、これをTempフォルダに展開し、展開後msiexecでmsiを実行する。このとき、日本語の場合、そうでない場合の二つの構成を用意しておき、言語設定に応じて使い分ける。

この方法については次のWebページで紹介されており、サンプルもダウンロード可能。

dotNetInstaller には非常に多くの設定がありますが、今回関係したところいがいはよくわかりません。

dotNetInstallerはconfigurationファイルを作成するInstaller Editorと、exeを作るコマンド InstallerLinker.exe からなる。

Installer Editor / Configurationファイル作成

準備
手順を単純化するため、どこかに作業フォルダを作成し、MySetup.msi をコピーする。
コマンドプロンプトを起動し、そのフォルダに移動しておく。InstallerLinker.exe 起動はここから行うことし、以下の定数#APPPATHはこの場所を指す。

dotNetInstaller起動
dotNetInstallerをインストール後、スタートメニューからInstaller Editor起動。

File > New
  • Logging > log_enabledをTrueに変更(推奨)
    log_fileの場所に出力される。
    • #TEMPPATHは標準では次の場所
      C:\Users\UserName\AppData\Local\Temp
  • UI > ui_levelをsilentに変更(デバッグ中はbasicでもよい)
  • Locale > lcidtype を User(またはUserExe以外)に変更
Edit > Add > Configurations > Setup Configuration
  • Language > lcid_filterを”1041”(日本語)に設定
  • Runtime > complete_commandに次のコマンドを入力
    msiexec /i #CABPATH\MySetup.msi TRANSFORMS=":ja-JP.mst"
    • #CABPATHはdotNetInstallerが作成するTempフォルダ。標準では次の場所。
      C:\Users\UserName\AppData\Local\Temp\{GUID}
    • "ja-JP"の部分は定義済み定数”#OSLOCALE”で置換可能だが、msiに組み込まれているmstと一致しないとエラーになる。
    • UIを表示させる場合は、少なくともメッセージのAPPLICATION_NAMEを変更する。
  • Main Dialog > dialog_show_installed をFalseに変更
  • Runtime > show_progress_dialogをFalseに変更(Trueでもよい)
"install:"を右クリック > Add > Embed > Embed File
  • sourcefilepathに次のパスを入力
    #APPPATH\MySetup.msi
  • targetfilepathにMySetup.msiを入力。
    #CABPATHからの相対パスで、別の名前でもよく、またサブフォルダを加えることもできるが、
    msiexec のパラメータと一致させること。
もうひとつSetup Configurationを追加
  • Setup Configuration以下の手順を繰り返し、もうひとつSetup Configurationを追加する。
    • Language > lcid_filterを"!1041"(日本語以外)に設定
    • Runtime > complete_commandに次のコマンドを入力(TRANSFORMSなし)
      msiexec /i #CABPATH\WavCutterSetup.msi 
configuration.xml保存
  • File > Save または Save As で準備で作成したフォルダ内に保存
InstallerLinker.exe実行 / setup.exe作成
  • 標準では次のフォルダにインストールされている。
    C:\Program Files (x86)\dotNetInstaller\bin
  • 次の要領でInstallerLinker.exeを実行する。
    >set linkerFolder="C:\Program Files (x86)\dotNetInstaller\bin"
    >%linkerFolder%\InstallerLinker.exe /o:setup.exe /t:%linkerFolder%\dotNetInstaller.exe /c:configuration.xml /v+
  • setup.exeが出力される。

0 件のコメント: