2017年8月20日日曜日

VS Install Projects .msi を作ろう

私の Visual Basic 歴は Express Edition がスタートだった為に、
これ迄、配布を考える時は、 ZIP 等に必要なファイルを纏める が多かったです。
でも、 Community を導入したのだから、
.msi ファイルでも作って見るか! と言う事で ... 。


配布なんて、怖ろしい事 (?) は、 とてもとても、 でした。
自分用に書いているものが殆どなので、他人さまに使って戴くなんて、あまり考えて来ませんでした。
しかし、汎用的に書く様になれば、自分の腕も磨かれます。
環境が変わった時にも、そのままで実行出来るケースが増えます。
そして、やはり、作れば公開したい と思うのも人情です。
どう? と 恐る恐る差し出す その 醍醐味!。

Express Edition では体験版的位置付けから、配布は ClickOnce 位でした。  機能制限が多くて。
でも、Community Edition では何でも出来てしまいます。
ならば、経験を!。

VS2013 VS2017 と揃えて分かったのは、
セットアッププログラム(ファイル)作成を考える時、
その候補は Visual Studio Installer Projects に絞られると言う事の様です。
VS2013 (Community 等) には、標準で、InstallShield Limited Edition へのインストールリンクが含まれていましたが、
VS2017 には見当たらない様です。  今後、変わるかも、ですが ... 。.
しかし、Visual Studio Installer Projects は追加導入の作業が必須です。


以下、 Visual Studio Installer Projects を使った経験を纏めます。


次のサイトにアクセスし、必ず、 VS のバージョンに合ったものを入手します。
  https://marketplace.visualstudio.com/items?itemName=UnniRavindranathan-MSFT.MicrosoftVisualStudio2013InstallerProjects
VS2013 では .exe 形式、 VS2017 では .vsix 形式 になっています。
各々の ... Installer Projects は Version が異なっています。

Visual Studio が起動していない状態で、これらを実行して、導入します。


導入すると、
Solution への 新規追加 のケースに Other Project Types - Visual Studio Installer が項目追加されます。
詳細項目は、 Setup Project / Web Setup Project / Merge Module Project / Setup Wizard  / CAB Project 5項目です。
一般的には、Setup Project か Setup Wizard かを実行する事になるのだと思います。

良く分かっていないのですが、 お任せ形式か、Wizard 形式か、の違いだと思いますが、
きっと、後から、手を入れれば、然程、相違は無いかと。


以下、Wizard で試します。
尚、既に、別 Project で Debug の済んだ Project があり、 各種設定も終了しているものとし、

これをセットアップするものを作る とします。

取り敢えず、Default の Project 名称 Setup1 のまま走って見ましょうか。

Setup Wizard (3 of 5) で、
Primary output from <ProjectName> を探し、 これをチェックします。
Setup Wizard (4 of 5) で
追加のファイルを選べる様ですがスキップして進みます。  コンテント等がある場合は必須。.
全ての Wizard をこなして完了します。
上記以外は、Default のまま Next で進んで来ました。

今は、 Setup1 Project に Debug / Release の 空 Folder が作られただけの状態です。
以下、少し脱線が入ります。  試して見たのですが、結局、作業取り消しした部分ですので、読み飛ばし OK です。.

  一先ず、VS IDE を離れ、
  スタートボタン等から、該当する Visual Studio Version 20xx の Folder に格納された
  Developer Command Prompt for VS20xx を探し、
  これを起動します。
  そして、 Where msiinfo を実行しましょう。
  C:\Program Files\Microsoft Visual Studio 12.0>Where msiinfo
  C:\Program Files\Windows Kits\8.1\bin\x86\MsiInfo.exe       x86 上の VS2013.

  C:\Program Files (x86)\Windows Kits\8.1\bin\x86\MsiInfo.exe      x64 上の VS2013.

  さて、VS IDE に戻り、
  File System(Setup1) タブの File System on Target Machine 、
  Solution Explorer の Setup1 、 の順にクリックし、 Property を表示させます。
  この中に、 PostBuildEvent 項目を見付け、
  右欄に表示される ... をクリックし、
  更に、 Macro をクリックして、
  次の内容を記述しましょう。
  "xxx\MsiInfo.exe" "$(BuiltOuputPath)" /W 10
     Source Project は TargetOS Windows 10 で、  VS2013 も Win10 上なので ... 。
     "C:\Program Files (x86)\Windows Kits\10\bin\x86\MsiInfo.exe" "$(BuiltOuputPath)" /W 10
  ここで、xxx は先の Where msiinfo の結果のパスに変えて下さいね。
  OK Button を押し、PostBuildEvent 項目が変わった事を確認します。.

  何か間違った様で、 管理者昇格不要のこの おまじない は Error を引き起こし、上手く機能しません。
  また、上手くいっても、 Program Files 系に入れるには 管理者として 実行しないと OUT!。
  そこで、 値を 削除 して、 未設定で進みます。
     注: 緑色の記述は .exe 起動自体は 昇格無で進み、 Program Files 系に書く時点で 昇格 Dialog が出ます 出ません。.
  
さて、本題に戻ります。

File System(Setup1) タブの File System on Target Machine 、
Solution Explorer の Setup1 、 の順にクリックし、 Property を表示させます。
序に、主要な各項目を確認して置きます。

AddRemoveProgramsIcon : * none *  注: Icon
Author : Default Campany Name
Description : * none *
DetectNewerInstalledVersion : True
InstallAllUsers : False
Localization : * Comply VS Setting * ?
Manufacturer : Default Campany Name
ProductName : Setup1
RemovePreviousVersions : False
TargetPlatform : x86
Title : Setup1
Version : 1.0.0

ううっ、 AnyCPU で Prefer 32 外し の Project なのに、
Platform が x86 x64 Itanium の3択 ... 。
どうしましょ ... 。

上の各項目 赤い字の項目 を実際の名称等で書き換えます。  Icon に関しては後述。.
  例: Title : Setup1 を < Project Name > と変えて置きます。
その他の項目も、必要に応じて弄って下さい。 (例: RemovePreviousVersion とか)
特に、 一般的には、 C:\Program Files\Manufacturer\ProductName になりますから、必ず、変更します。
変更しないと、 C:\Program Files\Default Company Name\Setup1\ 等にインストールされてしまいます。 
Version は OS の プログラムと機能 で表示されるものです。
App 上に Version 表示機能があれば、実際に Project にあるものが表示されますが、
双方を揃えて置いた方が良いのでしょう。  混乱の元。
但し、 値が 1.0.0 以上でないと、更新系の Properties が上手く機能しない との情報もあります。
(手持ちの環境下では、 0.6.0 から 0.6.1 更新でも上手く機能している様ですが ... 。  詳細は不明です。).


取り合えず、 Solution Explorer で Solution を選択し、 Configuration Manager を開き、
Setup1 の Build にチェックを入れます。
忘れずに!。


実際に、ここで Build しても良いのですが、 アイコンを整えます。
User's Desktop と、
User's Program Menu と、
です。
各々の Property の AlwaysCreate を True にし、
Name 及び Type とある箇所で 右クリックして、 Create New Shortcut を選びます。
Dialog の Application Folder をクリックし、 Primary output ... (Active) が出ますので、 これを選択し OK 。

これで、 Desktop と Program Menu への表示の下準備完了です。  が、完了ではありません!。.

次に、アイコン指定と名称変更をします。
このままでは、 Installer のアイコンが表示されます。
Shortcut to Primary output ... (Active) の部分をクリックすると現れる Properties の Icon 欄は (None) ですね。

上記の AddRemovalProgramIcon も同じなのですが、
Default の .ico ではなく、 .exe から指定アイコンを引っ張て来ましょう。

先ずは、 Dialog の File of Type を (*.exe) に変更し、 Application Folder をクリックします。
すると、 Primary output ... (Active) が出ますので、 これを選択し OK 。
アイコンが表示されるので、決定します。
そう、 Output から参照します。
名称も変えて置かないと、 変な名称が 指定箇所に表示され、ユーザーはびっくり。
Shortcut to Primary output ... (Active) の部分を 値(実際の Product 名等) に変更します。

名称の話が出たので、序に。
Setup1 と言う Project 名称で進みましたが、 これでは Setup1.msi と言う名のファイルが生成されます。
Project の名称を後から変更しても、これは変わりません。
Project を右クリックして、 Property から現れる Dialog で、
Output file name の値(=ファイル名) を変更しましょう。  Project の名称も併せて ね。

もし、 Platform 毎や Langage 毎に 生成したりする場合には、
ファイル名を Sub Folder 付きに変えて置かれると楽です。
例えば、 /x86en/SetupApp_x86en.msi とか、 /x64jp/SetupApp_x64jp.msi とか。
設定を変えて ,msi を出力した時に、 Sub Folder 付き ならば、旧のものが温存されますから。


Setup.exe の方は無関係ですが。

また、 これらを変更しても、Setup Project  そのもののファイルパスは Setup1 のままですが ... 。



ふぅ、 慣れない事をするのは、 疲れます ... 。



0 件のコメント:

コメントを投稿