プラグインを作る(番外編1)

プラグインを作ったら次のステップとして, 通常のアプリケーションとしても配布する時が来るかもしれません. そこで今回はWindows用にhello_worldのインストーラパッケージを作成してみましょう.

なぜインストーラを作ることに拘るのか? 実は私はインストールではなくアンインストール機能の方を重要視しています.(LinuxのディストリビューションをSlackwareからDebianに変えた理由もそうでした.) アンインストール機能は環境をクリーンに維持し, アップデートしていく上で基本的な機能だと考えているからです.

さて, インストーラパッケージを作成してみましょう.

ネットを検索すると次の様な話が出て来ます. 「distutils2が出来ればもっと良くなる.」, 「それまでの間はdistributeを使うのが云々.」 未来は素晴しいと信じていますが, 今Pythonをインストールしただけで使えるのはdistutilsという意味ですね.(どうやらdistutils2はPython3.3から入るようです.)

Windows用のインストーラパッケージを作るにはmsiもしくはwininstのいずれかを選びます.(何度も言いますがeggは現在アンインストールの機能が無いので使いません.) 単純にファイルを目的の場所に置くだけならどちらでも良いのですが, ショートカットを作成するのであればwininstの方が簡単です. ショートカットを作るのに使える関数が準備されているからです. 今回はショートカットを作るのでwininstの方を使います.

用意するファイルはsetup.pyとhello_world_postinst.py(こちらのファイルの名前は何でも良いのですが, 他のプログラムのファイルと区別出来るようにしておくべきでしょう)の2つです. setup.pyから見ていきましょう.

from distutils.core import setup

setup(
    name = 'hello_world',
    version = '1.0',
    scripts = ['hello_world.py', 'hello_world_postinst.py'],
    options = {'bdist_wininst': {'install_script': 'hello_world_postinst.py'}}
)

scriptsには直接実行するスクリプトファイルを列記します. hello_world.pyだけでなくインストール時に実行するhello_world_postinst.pyもここに書いておく必要があります.

optionsはbdist_wininstでパッケージを作成する際のオプションを指定しています. コマンドラインで

python setup.py bdist_wininst --install-script=hello_world_postinst.py

の様に指定することも出来ますが, 毎回書くのは面倒なのでここに入れておきます.

hello_world_postinst.pyはここに載せると長くなるので省略します. ninix-ayaのninix_win32_postinst.pyから必要な部分をコピーして改変して下さい.(次のhello_worldのリリース時にはアーカイブに入れる予定です.)←単独ではninix.pluginが無いので動きませんね.:-(
ショートカットを作る上でのポイントは, create_shortcut()でショートカットを登録した後に, そのショートカットのパス名を引数にしてfile_created()を呼ぶことです.

それとは別にhello_world_postinst.pyについて1つ重要な注意点があります. インストーラから実行される部分についてはsys.exit()やraise SystemEixtを呼んではいけません. sys.exit()等でスクリプトを終了するとインストーラも終了してしまい, インストールの処理が中途半端な状態になってしまいます. 具体的にはパッケージをアンインストールしてもインストールしたファイルやショートカットが削除されずに残ってしまうといった現象が発生します.(私はここでしばらく悩みました. :-p)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です