成しうる者が為すべきを為す

他愛ないダイアリーあるいは陳腐なナレッジベースもしくは独善的なフィロソフィ

7zipでインストーラーっぽいものを作ってみる話

ブログに飽きたわけじゃなくて単純に平日忙しいだけなんです

ということで1ヶ月ぶりの投稿になります

 

あまり自分個人が特定できるような話はしたくないのですが、今回は仕事絡みの話です

職業としては一応IT関係っぽいことをやっています

その中で"クライアントPCにソフトウェアをインストールする"という仕組みを作る必要があり、

プログラマーではない、知識ゼロの自分が色々なサイトをググって実現するところまでもっていけたので

それらをこの1記事でまとめておこうと思います

 今回の要件はざっとこんな感じでした

  • WindowsPCのCドライブ内の特定のフォルダにソフトウェアのインストールに必要なファイルやプログラムを展開する 
  • インストールプログラムは展開されるsetup.exeによって実行される
  • ユーザはダウロードしたインストーラーをダブルクリックして実行することで上記の展開からsetup.exeによるインストールまでを自動で行える

 既にインストールプログラムは開発済みだったので、あくまで今回必要となったのは

"クライアントPCに必要なファイル群を展開し、自動でsetup.exeを起動する"

という仕組みです

 

さて、これらを実現するにあたってまずは必要なものを揃えます

【必要なもの】

  • 7zip

    あんまり説明の必要ないですね、有名な圧縮・解凍ソフトです

    sevenzip.osdn.jp

 

  • 7zSD.sfx

    何これ、って言われると実は自分自身もあんまり分かっていません

    とりあえず今回の仕組みを実現するにあたって必要なコンポーネントという認識です

    github.com


    実はこれを準備するのに今回一番手間取りました
    今回のこのブログの内容でやってること、結構いろいろなサイトで
    同じ内容が紹介されているのですがどれも記事が古く、「この7zSDは7zipの中にある」と書いてあります
    けれども実際、今の7zipにこれはありません
    またあったとしても7zSDの古いバージョンを使うと、今回やろうとすることができません
    色々なバージョンを使ってみた結果、2016年頃以降の7zSDならできるようです
    (とりあえず上記のgithubのもので実現できるはずです)

  • コマンドプロンプト

    必要なもの、というか開発時に使うことになりますというだけ

 

 

インストーラーっぽいものの作り方】

それではいよいよ作っていきましょう

たったの4ステップでできます

 

1.展開したいファイルやプログラム郡を7zipで圧縮する

既に作成済みのsetup.exeや必要になるファイルなどを7z形式で圧縮してまとめます

この時、注意が必要なのですが1つのフォルダにまとめてから圧縮するとディレクトリ構造が変わってしまうためか展開時に失敗します

なのでオススメとしては展開したいファイルを1つずつCtrlキーを押しながら選択してから右クリックで"7-zip" > "圧縮"

f:id:erigeron:20190616181454p:plain

 今回は"archive.7z"という名前で圧縮しますが、ファイル名は何でも良いです

注意が必要なのは"パス名出力方法"は必ず"相対パス"であること、くらいです

とりあえずこれでクライアントPCに展開されるファイル郡はarchive.7zという1ファイルにまとまりました

 

2.configファイルを作成する

 次にarchive.7zで圧縮したファイル郡を展開する時の定義ファイルを作ります

UTF-8形式で以下のようなテキストファイルを作成しましょう

;!@Install@!UTF-8!
Title="Program Setup"
Directory="C:\\ProgramA"
InstallPath="C:\\ProgramA"
BeginPrompt="プログラムのインストールを開始します。"
RunProgram="setup.exe"
;!@InstallEnd@!

 1行目と最後の行はお約束のようなものなので特に何も変えなくて良いです

 2行目の"Title"にはユーザに表示するプロンプトのタイトル名を入れます

 3,4行目には圧縮したファイル郡を展開したいディレクトリパスを指定します

 パスの区切り文字は二重に入れるのがお作法のようです

 今回の指定の仕方ではCドライブ直下に"ProgramA"というフォルダを作成し、そこにファイルを展開します

 5行目の"BeginPrompt"ではユーザに見せるプロンプト内のメッセージを指定します

 6行目の"RunProgram"では圧縮ファイル展開後に自動起動させたいプログラムを指定します

 ここでは"setup.exe"を起動するために"RunProgram"を指定していますが、スクリプトファイルやバッチを指定する場合は

 "RunProgram"ではなく"ExecuteFile"で記述するようです

 詳しくはここ見たら分かるかも(流し読みしかしてないですが)

sevenzip.osdn.jp

 書けたらconfig.txtといった名前をつけて、先程作成したarchive.7zと同じ作業ディレクトリに保存しておきます

 ついでに7zSD.sfxも同じ作業ディレクトリに保存しておきます

 

3.exe化する

 それではいよいよexe化します

 コマンドプロンプトを起動し、archive.7zとconfig.txtと7zSD.sfxが保存してある作業ディレクトリへ移動します

 そして以下コマンドを実行するだけでexe化されます

    copy /b 7zSD.sfx + config.txt + archive.7z Install.exe

 Windowsのcopyコマンドで今回作成した3つのファイルを1つにまとめ、"Install.exe"として作成していますね

 

4.インストーラーを実行してみる

 作業ディレクトリ内に"Install.exe"ができているはずなので実行してみます

f:id:erigeron:20190616190958p:plain

 先程config.txtで指定したプロンプトのタイトルとメッセージが表示されていますね

 "はい"を選択するとこの後、指定したディレクトリ(C:\ProgramA)にファイルが展開され、setup.exeが自動起動します

 

 ということでこれにて7zipを利用してインストーラーっぽいものができました

 ・・・まぁ要は自己解凍書庫を作って、展開後に自動でプログラムを呼び出しているだけです

ここまででレジストリも特に汚さず、PCへの影響が少ないので個人的にはこの展開方法好きですね

 プログラマーじゃない人間がここまで実現できれば十分じゃないでしょうか

 それでは