miau's blog?

simple_upload

お蔵だしシリーズ第三段。YAML での定義に従って FTP でファイルをアップロードするだけのスクリプト。

simple_upload.zip(.pl のみ)
simple_upload_with_exe.zip(exe 同梱版。1.1 MB くらいあります。)

以下詳細です。




■動機

例えば Hoge プロジェクトで hoge01 サーバと fuga02 サーバを使っていて、それぞれ主に使うディレクトリが /usr/local/apache と /var/www であるような場合、それぞれのサーバに対応させる形で、
・E:\Workspace\Hoge\hoge01\usr_local_apache
・E:\Workspace\Hoge\fuga02\var_www
みたいなフォルダを作って、そこで作業してます。

で、ファイルを更新したら FTP でサーバにファイルをアップロードするわけですが、場合によっては
・FTP クライアントを起動するのが面倒くさい
 エディタからすぐに「アップロード」とかやりたい
・FTP クライアントでいちいちフォルダを移動するのが面倒くさい
 grep した結果を元に、さまざまなフォルダに配置されたファイルを一つ一つアップロードするのは面倒
なんてことがあります。

フォルダ構成はだいたい決まってるわけで。これを設定ファイルで定義しておけば、面倒なフォルダ移動しなくてもスクリプトが面倒みてくれるでしょ、という話です。

■使いかた

simple_upload_sample.yml を simple_upload.yml にリネーム or コピーして、(1) 全体の設定、 (2) ローカルフォルダとホスト/ディレクトリの対応、(3) 各ホストへの接続情報 を書きます。

実際のファイルを見るとある程度わかると思うんですが、

Options: # 全体設定。Net::FTP->new() の第二引数。
Debug: 0 # 1 にすると詳細なログを出力
Port: 20 # 以降の 3 行はファイアフォール使う人用。
Firewall: '192.168.1.1' # 使わない人は削っていいです。
FirewallType: 1
Mappings: # ローカルフォルダとホスト/ディレクトリの対応
- LocalPath: E:\Workspace\Hoge\hoge01\usr_local_apache
Login: hoge01 # Login のキーを指定
RemotePath: /usr/local/apache
- LocalPath: E:\Workspace\Hoge\fuga01\var_www
Login: fuga01
RemotePath: /var/www
Login: # 各ホストへの接続情報
hoge01: # Mappings で使用する名前
Host: 192.168.0.1
User: user01
Pass: pass01
fuga01:
Host: 192.168.0.2
User: user01
Pass: pass02

こんな感じです。

あとはコマンドラインで実行するもよし、Explorer でファイルを右クリックして「プログラムを指定して開く」から .exe にしたのを実行するもよし。これも .pl を実行する場合は、YAML パッケージが必要になります。
ちなみにマッピングされてないローカルファイルを指定した場合、編集のために YAML ファイルを開く仕組みだったかと。

■便利?な使いかた

・サクラエディタで編集したファイルを、Ctrl+F5 で「simple_upload.exe "$F"」とかやってすぐさまアップロード。
・変更したファイルを Tortoise SVN の「変更をチェック」ビューで確認して、「プログラムを指定して開く」→「simple_upload.exe」とかやってアップロード。

とか。小さなプログラムを連携させるこの手法はどちらかというと UNIX 寄りな考え方(UNIXという考え方 にそのまんまのことが書いてあった気がする)ですけど、なかなか便利ですよね。IDE よりも自由度高いし。

■ダメなところ

・複数のファイルを渡した場合も、いちいち接続しなおしてる。単純に手抜き。
・Options を Login ごとに設定できるようにすべきな気がする。自分の環境のことしか考えてないな・・・。
・Explorer の右クリックメニューから複数ファイルが送れなかったような気もする。

■ちょっと思ったこと

この simple_upload.yml って、結局前項のログイン用 YAML と同じような情報を保持してるわけで。
Ecplise の .project みたいなイメージで、プロジェクト毎の接続情報をまとめて保持する形にしたほうがいいのかな?とか思ったりもした。上記の例だと、

・E:\Workspace\Hoge\connect.yml

みたいなのを準備しておくとか。そしたら FTP クライアント上で「ちょっと Telnet コマンドを発行したい」とか思ったときも応用が効くし。

■ついでに

YAML で記述ミスが結構あったので、YAML を Dump するだけのこんな ymldump.pl とか用意してました。

use strict;
use warnings;
use YAML qw/LoadFile/;
use Data::Dumper;

my @files = glob('*.yml');

foreach my $file (@files) {
print "\n", '-' x 80, "\n";
print "$file\n";
print Dumper LoadFile($file);
}

system "pause";

ま、それなりに使いました。
posted at 17:19:51 on 2007-09-29 by miau - Category: Perl No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。