開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

OctaveのPackagesを全部インストールする

 研究のためにMATLABを使う機会が増えてきました。
 家でも動かしたいからOctaveを導入してみました。

 その際に、数多のパッケージをいちいちインストールするのが面倒だったので、
 全部インストールするスクリプトを書きました。

install_all_packages.m

% package一覧
v_all = pkg('list', '-forge') ;

% ループ
while true

    % インストール済みのパッケージ名を取得
    v_installed = pkg('list') ;
    names_installed = {} ;
    for i=1:length(v_installed)
        names_installed(end+1) = {v_installed{i}.name} ;
    end

    for i=1:length(v)
        
        % 未インストールならインストールを試みる
        name_pkg = v{i} ;
        if ~strcmpi(name_pkg, names_installed)
            try
                disp(['try installing : ' name_pkg]) ;
                pkg('install', '-forge', name_pkg) ;
                disp(['installed : ' name_pkg]) ;
            catch e
                disp(['failed : ' name_pkg]) ;
            end
        end
    
        sleep(0.1) ;
    end

    % 何もインストールされなければループ脱出
    num_ins_bef = length(v_installed) ;
    num_ins_aft = length(pkg('list')) ;
    if num_ins_bef==num_ins_aft
        disp(['finished ! ' num2str(num_ins_aft) 'installed']) ;
        break ;
    end

end

 全部終わるのに結構時間がかかると思います。
 環境によってはプロンプトにwarningとかerrorとか大量に表示されるかと思いますが、放置してください。

 以下、簡単な説明・・・

仕組み

 まずv_all = pkg('list', '-forge')でインストールできそうなパッケージの一覧を取ってきます。

 続いてv_installed = pkg('list')でインストール済みのパッケージの一覧を取得します。
 この一覧と先ほどのv_allを比べてやって、インストールしていないパッケージを選定します。

 インストールするのは

try
    disp(['try installing : ' name_pkg]) ;
    pkg('install', '-forge', name_pkg) ;
    disp(['installed : ' name_pkg]) ;
catch e
    disp(['failed : ' name_pkg]) ;
end

 ↑の部分です。try catchでくくっています。
 これは、インストールの際になんかよくわからないエラーが発生するためです。
 でもまぁ大体はインストールできるし、そんな重要そうでもなかったので、エラー処理は何もしておりません。

 最後に、インストールを試みる前後でインストール済みのパッケージ数が変わるかを見て、変わればループ続行、変わらなければループを抜けます。
 それぞれのパッケージには依存関係があり、インストールする順番が正しくないとインストールされないものもあるため、ループさせています。
 (本来なら依存関係を調べてからインストールするものですが、まぁ・・・)

 以上です。
 Mac OS X 10.9で試しました。Windowsでも動けばいいなぁ。