概要
Bazaar をUSBメモリなどで持ち運べるよう、ポータブル化します。
目標
- ファイルサイズをできる限り小さく
- レジストリを汚さない
- 使用PCにファイルを残さない
使用したのは、Bazaar 2.1.1 (bzr-2.1.1-setup.exe) (2.1 Stable Release - Standalone)
インストール
インストーラの展開
WindowsDownloads - Bazaar Version Control から、最新版の Standalone Installer の exe ファイルをDLします。私が使ったのは、 bzr-2.1.1-setup.exe。
この exe は、 Inno Setup で作成されているので、展開するには、 innounp を用いる。コマンドプロンプトで下記のように入力する。
innounp.exe -x -m -a -d"展開先フォルダ" bzr-2.1.1-setup.exe
展開された中で必要なのは、 \{app}\ フォルダだけなので、他は削除してもかまわない。
不要ファイルの削除
\{app}\ フォルダの中から不要な ファイル/ディレクトリ を削除する。
- 不要ディレクトリ
\doc \lib\help_topics \locale \plugins\bzrtools \plugins\explorer \plugins\launchpad \plugins\netrc_credential_store \plugins\news_merge \plugins\qbzr\locale\ar \plugins\qbzr\locale\cs \plugins\qbzr\locale\da \plugins\qbzr\locale\de \plugins\qbzr\locale\en \plugins\qbzr\locale\en_GB \plugins\qbzr\locale\es \plugins\qbzr\locale\et \plugins\qbzr\locale\fr \plugins\qbzr\locale\gl \plugins\qbzr\locale\he \plugins\qbzr\locale\hu \plugins\qbzr\locale\it \plugins\qbzr\locale\nl \plugins\qbzr\locale\pl \plugins\qbzr\locale\pt_BR \plugins\qbzr\locale\ru \plugins\qbzr\locale\sk \plugins\qbzr\locale\sl \plugins\qbzr\locale\sr \plugins\qbzr\locale\sv \plugins\qbzr\locale\tr \plugins\qbzr\locale\uk \plugins\rebase \plugins\svn \plugins\upload \plugins\xmloutput
- 不要ファイル
bazaar.url bzr-developers.chm bzr-en.chm bzr-es.chm bzr-ru.chm bzr_postinstall.exe MSVCR71.dll tbzrcache.exe tbzrcachew.exe tbzrcommand.exe tbzrcommandw.exe tbzrshellext_x64.dll tbzrshellext_x86.dll tbzrtrace.exe
もちろんこれは私が不要と考えたものなので、削除するものは利用者自身で適宜選択してほしい。
\lib\library.zip の圧縮
\lib\library.zip の中には、動作に必須のファイルが入っていて、拡張子からも分かるだろうが、 ZIP で圧縮されている。 しかし、これは圧縮レベルが無圧縮になっているので、圧縮というよりは tar だ。これを圧縮することによって、必要ファイルサイズを少なくできる。
library.zip をフォルダを作成して解凍し、そのファルダ配下を 7-Zip 9.15 beta で圧縮した。書庫形式:zip、圧縮レベル:超圧縮、圧縮メソッド:Deflate という設定。
※ ただし、これによってパフォーマンスが多少落ちるのではないかと思われる。が、最近の PC であれば、体感できるほどの差はないだろう。
PEファイル (exe, dll, pyd) の圧縮
\{app}\ フォルダ配下にある、 \imageformats\*.dll 以外のすべての exe, dll, pyd を UPX 圧縮する。
UPX 3.05w を使った。オプションは、
--best --overlay=strip
注意すべきなのは、 \lib\*.pyd も PEファイル なので忘れずに圧縮するということと、 \imageformats\ 配下の DLL は圧縮してはならないということだ。(圧縮してしまうと、 qbzr が使えなくなる)
また、 Mercurial とは違い、 library.zip の中に PEファイル はないようだ。
どうでもいいが、 PEファイル を探すには、拙作ソフトの Change-SubsystemVersion を使うと楽だった。(そういう目的で作ったソフトではないんだが……)
USBメモリなどに移動
これで一応、一区切りついたので、 \{app}\ フォルダを、 Bazaar などにリネームしてUSBメモリなど、好きな場所に移動させる。
便利に使う為に
start_bzr.bat を改造する
デフォルトで付いてくる start_bzr.bat ファイルを改造する。
@ECHO OFF REM ****************************************************** REM ** You can change following environment variables ** REM ** that affects on bzr behaviour ** REM ****************************************************** REM If you don't add Bzr directory to system-wide PATH environment variable REM you can modify local PATH REM SET PATH=C:\Program Files\Bazaar;%PATH% REM Change next line to set-up e-mail to identify yourself in bzr REM SET BZREMAIL= REM Change next line to specify editor to edit commit messages REM SET BZR_EDITOR= REM Change next line to tell where bzr should search for plugins REM SET BZR_PLUGIN_PATH= REM Change next line to use another home directory with bzr REM SET BZR_HOME= REM Change next line to control verbosity of .bzr.log REM SET BZR_DEBUG=30 REM -------------------------------------------------------------------------- @ECHO ON @bzr.exe help
デフォルトだと上記のようになっているが、これを下記のように変更する。
@echo off set PATH=%~dp0;%PATH%; :: 重要 set BZR_HOME=%~dp0 :: お好みで cd /d "%~dp0_Project" :: プロセスが2つになるので、そのままcmd /kなどを実行しない :: startコマンドでタイトルを変更しない。コンソールの設定を継承しないから start %ComSpec% /U /K "title Bazaar Portable (%~dp0)"
もちろん、その他の環境変数を設定したい場合などは、それに合わせ適宜変更する。
bazaar.conf / ignore ファイルなどの設定ファイルの保存先
上の start_bzr.bat 中で環境変数 %BZR_HOME% を設定しているが、その直下の \bazaar\2.0\ に bazaar.conf / ignore などの設定ファイルを保存すればいい。
上記の通りに作成したのならば、バッチファイルと同じ場所に \bazaar\2.0\ ディレクトリを作り、そこに保存する。
相対パスでの指定
Bazaar では、 Mercurial とは違い、 bazaar.conf の中で相対パスが使える。例えば、
editor = ..\..\..\Editor\sakura\sakura.exe # " で囲んでも使える。 # editor = "..\..\..\Editor\sakura\sakura.exe"
のように。これは、 bzr version した時に表示される、 Bazaar configuration: のパスからの相対パスとなる。要するに %BZR_HOME%bazaar\2.0\ (bazaar.conf) からの相対パスだ。
ただ、これはちょっと分かりづらいので、 Mercurial をポータブル化する 時に使った、 動的生成スクリプト を利用して、絶対パス指定した方が分かりやすいのではないだろうか。
完成
動作確認
以上で完成となる。
当然、本番で使う前に適当に使ってみて動作を確認しておいたほうがいいだろう。こちらでは、 bzr.exe init, commit, log, branch, push, pull, qci, qlog などが問題なく使えることは確認済み。
最終的なファイルサイズなど
私の環境では、総サイズ 19.3 MiB で、 bazaar-tree.txt となった。 Qt 以外では、レジストリ / ファイル も残さない。
\lib\ / \lib\library.zip を整理すればもう少し削れそう。
ちなみに、デフォルトインストール(インストーラを実行して、何も考えずに Next ボタンを連打)だと、 \Bazaar\ ディレクトリだけで、 63.1 MiB (66,259,430 bytes) だった。
その他
環境変数 %BZR_HOME%
バッチ中で、 %BZR_HOME% を設定しなかった場合、
%USERPROFILE%\My Documents\.bzr.log %APPDATA%\bazaar\2.0\
が作られてしまうので、忘れずに設定する。設定すると、 .bzr.log / \bazaar\2.0\ は、 %BZR_HOME% 直下に作られる。
レジストリにゴミが……
qbzr を使用した場合、
HKCU\Software\Trolltech\OrganizationDefaults\Qt Factory Cache 4.4\com.trolltech.Qt.QImageIOHandlerFactoryInterface:\ HKCU\Software\Trolltech\OrganizationDefaults\Qt Plugin Cache 4.4.false\
が作られる。これは、 Qt のせいなので、 qbzr を使わないか、 Bazaar (cmd.exe) が終了するまで待機し、終了時に削除するバッチかスクリプトを作ればいいだろう。あるいは、ランチャーの機能を使う。
XP 以降なら reg コマンドがある。
reg.exe DELETE HKCU\Software\Trolltech /f
reg ファイルでやるならこうなる。
REGEDIT4 [-HKEY_CURRENT_USER\Software\Trolltech]
bzr branch lp:hogehoge
上記手順通りにすると、
bzr branch lp:hogehoge
のような lp: は使えない。しかし、
bzr branch https://code.launchpad.net/hogehoge
等は使えるので、特に問題はないだろう。必要なら、 launchpad プラグインを残せばいい。