FreeBSD OS をアップデートしたため、その作業に影響され perl もマイナーバージョンアップしてしまったところ、とても重宝している dropbox-api コマンドが動かなくなってしまいました。
> dropbox-api help Can't locate DateTime.pm in @INC (@INC contains: /usr/local/lib/perl5/5.12/BSDPAN /usr/local/lib/perl5/site_perl/5.12/mach /usr/local/lib/perl5/site_perl/5.12 /usr/local/lib/perl5/5.12/mach /usr/local/lib/perl5/5.12 .) at /usr/local/bin/dropbox-api line 9. BEGIN failed--compilation aborted at /usr/local/bin/dropbox-api line 9.
/usr/ports/UPDATING を読んでみると、perl モジュールインストールディレクトリ構成が変更になったみたいです。
20130612: AFFECTS: users of lang/perl* and any port that depends on it AUTHOR: az@FreeBSD.org lang/perl5.12 upgrade from version 5.12.4 to 5.12.5 lang/perl5.14 upgrade from version 5.14.2 to 5.14.4 lang/perl5.16 upgrade from version 5.16.2 to 5.16.3 Also was modification to directory structure where is perl installed. Instead major.minor.patchlevel now only major.minor. The "perl-after-upgrade" script is removed. Please rebuild all perl ports and all ports that depend in it: # portmaster -r perl or # portupgrade -rf perl or # pkg install -fR perl
dropbox-api コマンドだけは、/usr/ports からインストールされるパッケージのバージョンが古いため、github からインストールしています。そのための現象だと思いますが、現在 dropbox-api コマンドが使えない状況!
これだから正常に動作しているアプリケーションを更新するのは嫌いだ!
さて、原因は dropbox-api が必要とする perl モジュールが、新しくなった /usr/local/lib/perl5/site_perl/5.12 ではなく、 /usr/local/lib/perl5/site_perl/5.12.4 に残ったままになっているためだと判明しました。 /usr/local/lib/perl5/site_perl/5.12.4 の下のパッケージだけ一括して、アンインストールし、再インストールできれば簡単なのですが、どうやればそれが出来るのかがわからない! 思いつくのは、一つずつパッケージ名を調べて、ports ディレクトリの下で、make deinatall reinstall clean を繰り返すこと。かなり面倒くさい作業になりそうですが、やるしかない。少しでも効率化するために、次のようにします。
- cd /var/db/pkg
grep site_perl */+CONTENTS | grep “5.12.4” | more
これで、/usr/local/lib/perl5/site_perl/5.12.4 にインストールされているモジュールがどのパッケージに含まれているのかリストアップできます。 - cd /usr/ports
make search key=”p5-libwww” | grep “Path:” | grep “p5-libwww”
という感じで、パッケージ名の一部を検索し、grep でフィルタリングします。こんな感じでパッケージ名が表示されます。
「Path: /usr/ports/www/p5-libwww」 - このディレクトリに移動して、
# make deinstall reinstall clean
を延々と繰り返します。 - /usr/local/lib/perl5/site_perl/5.12.4 の下がほぼ空っぽになれば終了。ディレクトリだけ残る場合がありますが、それは無視していいでしょう。
- この後で、dropbox-api コマンドを発行して、動作すれば解決。
なんだかんだで 2時間くらい作業して、ようやく元に戻りました。
> dropbox-api help Usage: dropbox-api <command> [args] [options] Available commands: setup get access_key and access_secret ls list directory contents find walk a file hierarchy cp copy file or directory mv move file or directory mkdir make directory (Create intermediate directories as required) rm remove file or directory (Attempt to remove the file hierarchy rooted in each file argument) put upload file get download file sync sync directory (local => dropbox or dropbox => local) uid get accound uid Common Options -e enable env_proxy ( HTTP_PROXY, NO_PROXY ) -D enable debug
See 'dropbox-api help <command>' for more information on a specific command.
あとは、実際に Dropbox サーバーと同期して、以前のように使えるかどうかを確認する予定です。