Practice of Programming

プログラム とか Linuxとかの話題

Helper::Simple

perlシンタックスカラーを有効にしたら、コードが途中で切れてたので、修正
それ、Module::Setupで?
2ヶ月くらい前にCodeReposにあげて、途中放置して、忘れちゃったりで、グダグダだったのをここ数日でまとめました。
なんか色々微妙だったので、だいぶ変えてしまった(というか、バサバサ切った)。
CPANに上げる際には、別の名前を考えないとなー。Helperなんて、名前空間ないですもんね。


Helper::Simple(名前募集中)
http://coderepos.org/share/browser/lang/perl/Helper-Simple/trunk

動機

  • アプリケーションのインストーラーを作りたかった
  • Catalyst::Helperをコピペして作ってみた
  • ファイルが増えるたびに苦痛になってきた
  • やってらんない。あほらしい
  • 自分で作ることにした

コンセプト

  • ヘルパースクリプトの生成のためのモジュール
  • ポータビリティを意識してみた
  • なるべく簡単に

特徴

  • 手続きをデータ化して後で展開する
  • インストールにHelper::Simple(のインストール)は不要
  • Webからダウンロードに対応
    • ライセンス上、同梱できないものもあるだろうし
  • テンプレートは普通のファイルでもOK
    • ローカルのファイルをスクリプト内にzipにして格納する
    • 普通にモジュールなどを作成して、置き換えたいところだけ、[% ... %]で置き換える
    • .tt 拡張子の場合は、[* ... *]
  • Plugin作れます?
    • まだ作ってないし、テストもしてない

欠点

  • 順番を厳密には指定できない

例:とても簡単なCatalystのセットアッパー

CodeReposにあげてるサンプルから。

まず、雛形の準備。
http://coderepos.org/share/browser/lang/perl/Helper-Simple/trunk/sample/catalyst_template.sh

#!/bin/sh

catalyst.pl CatalystTemplate;
cd CatalystTemplate;
./script/catalysttemplate_create.pl view TT TTSite
find -type f | xargs perl -p -i -e 's{CatalystTemplate}{\[% appclass %\]}'
find -type f | xargs perl -p -i -e 's{catalysttemplate}{\[% appname %\]}'

create_catalyst_helper.plの作成
http://coderepos.org/share/browser/lang/perl/Helper-Simple/trunk/sample/create_catalyst_helper.pl

#!/usr/bin/perl

use strict;

die "Need class name & helper name" unless $ARGV[1];
my($appclass, $appname) = ($ARGV[0], lc $ARGV[0]);

package MyHelper;
# ここがrootディレクトリになる

use Helper::Simple;

# Template用の変数を埋め込み
var {
  appclass => $appclass,
  appname  => $appname,
};

# ローカルのCatalystTemplateディレクトリからコピーする
# render_file => 1 で、変数とかを埋め込む
copy ['CatalystTemplate', {render_file => 1}];


package MyHelper::CatalystTemplate::root::static::js;
# CatalystTemplate/root/static/js ディレクトリ

use Helper::Simple::Const; # ダウンロード箇所などの定数定義がしてある

# jquery.ui のダウンロードを行う。ask を前につけることで、質問する
ask dl JQUERY_UI;
# jquery.suggest.js のダウンロードを行う。ask を前につけることで、質問する
ask dl JQUERY_SUGGEST;

# ルートディレクトリから先頭マッチで、パスを変更する(定義した順番に変更される)
path_exchange 'CatalystTemplate/lib/CatalystTemplate', 'CatalystTemplate/lib/' . $appclass;
path_exchange 'CatalystTemplate/script/catalysttemplate',  'CatalystTemplate/script/' . $appname;
path_exchange 'CatalystTemplate/catalysttemplate',  'CatalystTemplate/' . $appname;
path_exchange 'CatalystTemplate/root/static/js/jquery.ui-1.5.2', 'CatalystTemplate/root/static/js/jquery.ui';
path_exchange 'CatalystTemplate', $appclass;

# ヘルパースクリプトを生成する
setup_script $ARGV[1];

1ファイルに書いていますが、別に分けてもかまいません。
パッケージ名がディレクトリに一致し、そのパッケージ内で行ったことは、そのディレクトリ内で行われます。


Helper::Simple を use した名前空間に属するすべてのモジュールに対して、Helper::Simpleは必要な関数のエクスポートを行います。
ルートパッケージで use Helper::Simpleをすれば、それ以外のモジュールで use する必要はありません。


使う関数は、大して多くありません。

  • var
    • Templateに埋め込む変数定義
  • copy
  • dl/download
    • Webからファイルをダウンロード
  • file
    • テキストでファイルを作成する
  • ask
    • file, copy, dl の前につけて、実行するかどうか聞くもの
  • path_exchange

くらいです。copy と、dl/downloadは、オプションを取ることができます。
主要なオプションは

copy/download共通

  • extract (copyは圧縮ファイルを指定した場合だけ)
    • zip, tar.gz/tgz, tar.bz2/tbz が指定できます。指定すると展開します。1だと勝手に判断します
    • でも、gzのみは対応してない(ぉ

copyのみ

  • render_file
    • 1 を指定すると、中をTemplateモジュールで書き換えます

dl/downloadのみ

  • omit
    • 展開する際に指定されたディレクトリを削ります
    • omit が指定されている場合、マッチしないディレクトリは展開しません

どうでしょう?簡単、じゃないかなぁ?

作られたスクリプトの特徴

データ部分は、base64エンコードされているので、blogにだって貼れないことはない。
数千行の記事が可能なら(ぉ

TODO

  • テストが足りない
  • file が使いにくい(たぶん、変えるが、copy使えば良いから存在意義が)
    • file のヒアドキュメントの書き方とか、Catalyst::Helper踏襲したのが、良くない。やめたほうが良い。
  • SVN checkoutとかに対応したいかなぁ
  • 生成されたスクリプトから生成もとのスクリプト/データの生成とか

思ったこと

データ作るプログラムじゃなくて、
大半データそのもの(設定ファイルとか)でいけたんじゃないかなぁ...(ぉ