Perl版ビルドツールDaiku 入門の入門

■ 目次

  1. 概要
  2. ビルドツールとは
  3. インストール
  4. Hello World
  5. もう少し使ってみる
    1. タスクに引数を与える
    2. タスクの階層化
    3. 1度に複数のタスクを実行する
    4. 処理の切り出し
  6. 参考

■ 概要

ビルドツールである「Daiku」について紹介します

Infrastructure as Code(サーバ構築やデプロイなどをコードで管理する)が流行っている今以前紹介したFabricやDaikuなどが使えるのかなと思います

Daiku and Daikufile are now production ready
こちらによるとRakeの機能をだいたいパクったということでRakeのPerl版という位置づけみたいです

シェルを羅列できるので学習コストが低いのも利点の一つだと思います

■ ビルドツールとは

プログラムをビルドするための一連の作業を自動化するためのツールになります

makeとかが有名なのかと思いますがJavaScript系だとGruntやgulpなどがあったりします
ビルドツールまとめ。Gruntとかgulpとか (フロント寄り)

■ インストール

cpanmのインストール

$ cd /usr/bin/
$ sudo curl -LOk http://xrl.us/cpanm
$ sudo chmod +x cpanm

Daikuをインストールするために必要なものをインストールする

$ sudo yum install perl-devel perl-TAP-Harness-Archive perl-Capture-Tiny perl-Mouse

Daikuのインストール

$ sudo cpanm Daiku

確認

$ whereis daiku
daiku: /usr/local/bin/daiku

■ Hello World

// サンプルファイルを用意
$ cat Daikufile.pl
desc 'hello';
task default => sub {
    sh "echo 'Hello, world!'";
};

// desc: タスクの説明
// task: タスクの定義
// default: タスク名を指定しなかった場合、デフォルトで呼ばれるタスク
// sh: シェルを実行できる

// タスクを一覧
$ daiku -T -f Daikufile.pl
daiku default  # hello

// Daikufileを指定して実行
$ daiku -f Daikufile.pl
[LOG] Building Task: default
Hello, world!

■ Hello World

タスクに引数を与える

$ cat Daikufile.pl
use Data::Dumper;

desc 'hello';
task hello => sub {
    my ($task, $name) = @_;
    print Dumper $task;
    print Dumper $name;
    sh "echo $name Helllo World!!";
};

実行方法

$ daiku -f Daikufile.pl 'hello[hoge]'
[LOG] Building Task: hello
$VAR1 = bless( {
                 'registry' => bless( {
                                        'tasks' => {
                                                   'hello' => $VAR1
                                                 },
                                        'namespaces' => []
                                      }, 'Daiku::Registry' ),
                 'desc' => 'hello',
                 'deps' => [],
                 'dst' => 'hello',
                 'code' => sub { "DUMMY" }
               }, 'Daiku::Task' );
$VAR1 = 'hoge';
hoge Helllo World!!

タスクの階層化

namespaceを使ってタスクの階層化ができる
例えば同じファイル内でサーバ毎にタスク名を作るときに
servername_buildなどを作らなくても良いようにnamespaceという概念がある

$ cat Daikufile.pl
namespace build => sub {
  desc 'server1 build';
  task server1 => sub {
    sh "echo server1 build !!";
  };

  desc 'server2 build';
  task server2 => sub {
    sh "echo server2 build !!";
  };
};

実行方法

$ daiku -f Daikufile.pl build:server1 build:server2
[LOG] Building Task: build:server1
server1 build !!
[LOG] Building Task: build:server2
server2 build !!

namespaceはネストすることもできる

1度に複数のタスクを実行する

複数のタスクで1つのタスクとさせることができる

$ cat Daikufile.pl
task build => ['build:server1', 'build:server2'];
namespace build => sub {
  desc 'server1 build';
  task server1 => sub {
    sh "echo server1 build !!";
  };

  desc 'server2 build';
  task server2 => sub {
    sh "echo server2 build !!";
  };
};

実行方法

$ daiku -f Daikufile.pl build
[LOG] Building Task: build
[LOG] Building Task: build:server1
server1 build !!
[LOG] Building Task: build:server2
server2 build !!

処理の切り出し

Daikufileが長くなると管理が難しくなるため別ファイルに切り出すことができる

$ cat Daikufile.pl
use Task::Build;

desc 'build';
task default => sub {
  require Task::Build;
  Task::Build->run();
};

$ cat Task/Build.pm
#!/usr/bin/perl

package Task::Build;

sub run {
  print "helloooooooo\n";
}
1;

$ daiku -f Daikufile.pl
[LOG] Building Task: default
helloooooooo

■ 概要


Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です