Bazaar をポータブル化する方法

概要

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 プラグインを残せばいい。

QLOOK ANALYTICS Counter