rksoftware

Visual Studio とか C# とかが好きです

CakeBuild でタスクの中でタスクを実行する

今回のスクリプトは良くないスクリプトだと、私のエンジニア勘が告げています。

■ 今回実行するスクリプト

var target = Argument("target", "Default");

Task("Default").Does(() =>{ Information("Hello World!"); });

Task("cs").Does(() => { Information("Hello C#!"); });

Task("both").Does(() => { RunTarget("Default"); RunTarget("cs"); });

RunTarget(target);

Defaultcsboth の3つのタスクを定義しています。
その中で both の中で

RunTarget("Default"); RunTarget("cs");

と書いて、Defaultcs のタスクを実行しています。

both を実行してみる

>.\tools\Cake\Cake -target=both

========================================
both
========================================

========================================
Default
========================================
Hello World!

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0063018
--------------------------------------------------
Total:                        00:00:00.0063018

========================================
cs
========================================
Hello C#!

Task                          Duration
--------------------------------------------------
cs                            00:00:00.0065491
--------------------------------------------------
Total:                        00:00:00.0065491

Task                          Duration
--------------------------------------------------
both                          00:00:00.0564927
--------------------------------------------------
Total:                        00:00:00.0564927

書いたとおりの結果になりました。けれど、この使い方はおそらく正しくないです。書けば動くという確認としてやってみました。
ただしくは .IsDependentOn メソッドを使うのがよさそうです。

※CakeBuild を試してみた記事の目次です。

CakeBuild でメソッドを書いて使う

Cake は C# でスクリプトが書けるのでメソッドも書いて使えます。
具体例は今回実行するスクリプトを見てください。

■ 今回実行するスクリプト

var target = Argument("target", "Default");
var number1 = Argument("number1", "123000");
var number2 = Argument("number2", "456");

int.TryParse(number1, out var numverValue1);
int.TryParse(number2, out var numverValue2);

int Add(int val1, int val2) => val1 + val2;

Task("Default").Does(() =>
{
  Information($"Added: {Add(numverValue1, numverValue2)}!");
});

RunTarget(target);

引数 number1number2 で数字文字列を二つ受け取り int にパースして自作メソッド Add に渡して結果を表示しています。

int Add(int val1, int val2) => val1 + val2;

と、見慣れた C# コードでメソッドを定義できています。

■ 実行

>.\tools\Cake\Cake -number1=2540 -number2=3331

========================================
Default
========================================
Added: 5871!

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0236941
--------------------------------------------------
Total:                        00:00:00.0236941

きちんと実行され、メソッドが使えていることが確認できました。

※CakeBuild を試してみた記事の目次です。

CakeBuild で引数で数値を扱う

Cake は素人なのでこれで良いのかということろはあるのですが、こんなこともできましたということで。

■ 引数の指定

Cake ではスクリプトの中で

var number1 = Argument("number1", "123000");

のようなコードを書いて、実行時に

Cake -number1=2540

のように引数を与えると、変数 number12540 が入ります。

■ 実行してみるスクリプト

今回は、次のスクリプトを実行しながら動作を確認してみます。

var target = Argument("target", "Default");
var number1 = Argument("number1", "123000");
var number2 = Argument("number2", "456");

int.TryParse(number1, out var numverValue1);
int.TryParse(number2, out var numverValue2);

Task("Default").Does(() =>
{
  Information($"Hello {numverValue1 + numverValue2}!");
});

RunTarget(target);

Cake のスクリプトは C# なので、int.TryParseout var なども書けます。

■ 引数なしで実行

>.\tools\Cake\Cake

========================================
Default
========================================
Hello 123456!

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0165981
--------------------------------------------------
Total:                        00:00:00.0165981

number1number2 が数値にパースされて数値演算されていることが確認できます。

var number1 = Argument("number1", "123000");

Argument の第二引数がデフォルト値なので 123,000 + 456 = 123,456 です。

■ 引数を付けて実行

>.\tools\Cake\Cake -number1=2540 -number2=3331

========================================
Default
========================================
Hello 5871!

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0197005
--------------------------------------------------
Total:                        00:00:00.0197005

number12540number23331 となり
2,540 + 3,331 = 5,871 です。引数に値が数値になって足し算されていることが確認できました。

※CakeBuild を試してみた記事の目次です。

CakeBuild で引数を使う

Cake では実行するタスクを引数で指定することができます。
引数で指定するとスクリプトの次の部分の変数 target に与えた値が入ります。引数を与えていない場合は、次のコードで指定されているデフォルト値 Default が設定されます。

var target = Argument("target", "Default");

■ 試してみるスクリプト

次のスクリプトで動作を見てみます。

var target = Argument("target", "Default");
var name = Argument("name", "World");

Task("Default").Does(() =>
{
  Information($"Hello {name}!");
  Information(name.GetType().FullName);
});

RunTarget(target);

■ 引数なしで実行

>.\tools\Cake\Cake

========================================
Default
========================================
Hello World!
System.String

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0263882
--------------------------------------------------
Total:                        00:00:00.0263882

デフォルト値である Default として実行されました。
ついでにこっそり表示していた、変数 target の型が string であるとこも確認できます。

■ 引数をつけて実行

今度は、C# という引数を与えて実行してみます。
引数は

Cake -name=C#

のように、

Cake -[ Argument の第一引数の値 ]=[ 与える引数(デフォルト値は Argunment の第二引数の値) ]

という指定をします。

実行結果

>.\tools\Cake\Cake -name=C#

========================================
Default
========================================
Hello C#!
System.String

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0226930
--------------------------------------------------
Total:                        00:00:00.0226930

狙い通り、name の値が C# としてタスクが実行されました。

※CakeBuild を試してみた記事の目次です。

CakeBuild で実行するタスクを選択する(build.ps1)

Cake でスクリプト内に複数のタスクを定義して、選択して実行する方法です。

■ スクリプト

こんな感じに、Defaultcs というタスクを書きます。

var target = Argument("target", "Default");

Task("Default").Does(() =>{ Information("Hello World!"); });

Task("cs").Does(() => { Information("Hello C#!"); });

RunTarget(target);

■ build.ps1 の場合

build.ps1 -script [ スクリプトファイル名 ] -target [ タスク名 ]

で [ タスク名 ] のタスクを実行できます。[ スクリプトファイル名 ] は build.cake の場合は省略できます。

build.ps1 -target [ タスク名 ]

■ 実行結果 Default を実行する

> .\build.ps1 -target default
Preparing to run build script...
Running build script...

========================================
Default
========================================
Hello World!

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0203485
--------------------------------------------------
Total:                        00:00:00.0203485

■ 実行結果 cs を実行する

> .\build.ps1 -target cs
Preparing to run build script...
Running build script...

========================================
cs
========================================
Hello C#!

Task                          Duration
--------------------------------------------------
cs                            00:00:00.0183951
--------------------------------------------------
Total:                        00:00:00.0183951

■ タスクを指定しない場合

var target = Argument("target", "Default");

で書かれた、二つ目の引数のタスクが実行されます。

> .\build.ps1
Preparing to run build script...
Running build script...

========================================
Default
========================================
Hello World!

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0185739
--------------------------------------------------
Total:                        00:00:00.0185739

スクリプトを書き換えて

var target = Argument("target", "cs");

とすると

> .\build.ps1
Preparing to run build script...
Running build script...

========================================
cs
========================================
Hello C#!

Task                          Duration
--------------------------------------------------
cs                            00:00:00.0178635
--------------------------------------------------
Total:                        00:00:00.0178635

となりました。

※CakeBuild を試してみた記事の目次です。

CakeBuild で実行するタスクを選択する(Cake.exe)

Cake でスクリプト内に複数のタスクを定義して、選択して実行する方法です。

■ スクリプト

こんな感じに、Defaultcs というタスクを書きます。

var target = Argument("target", "Default");

Task("Default").Does(() =>{ Information("Hello World!"); });

Task("cs").Does(() => { Information("Hello C#!"); });

RunTarget(target);

■ Cake.exe の場合

Cake.exe [ スクリプトファイル名 ] -target=[ タスク名 ]

で [ タスク名 ] のタスクを実行できます。[ スクリプトファイル名 ] は build.cake の場合は省略できます。

■ 実行結果 Default を実行する

>.\tools\Cake\Cake -target=Default

========================================
Default
========================================
Hello World!

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0262946
--------------------------------------------------
Total:                        00:00:00.0262946

■ 実行結果 cs を実行する

>.\tools\Cake\Cake -target=cs

========================================
cs
========================================
Hello C#!

Task                          Duration
--------------------------------------------------
cs                            00:00:00.0386132
--------------------------------------------------
Total:                        00:00:00.0386132

■ タスクを指定しない場合

var target = Argument("target", "Default");

で書かれた、二つ目の引数のタスクが実行されます。

>.\tools\Cake\Cake

========================================
Default
========================================
Hello World!

Task                          Duration
--------------------------------------------------
Default                       00:00:00.0262946
--------------------------------------------------
Total:                        00:00:00.0262946

スクリプトを書き換えて

var target = Argument("target", "cs");

とすると

>.\tools\Cake\Cake

========================================
cs
========================================
Hello C#!

Task                          Duration
--------------------------------------------------
cs                            00:00:00.0494020
--------------------------------------------------
Total:                        00:00:00.0494020

となりました。

※CakeBuild を試してみた記事の目次です。

城東.NET #34 勉強会を開催しました。

■ 城東.NET

城東.NET #34 を開催しました。

城東.NET は東京の最近は秋葉原で毎月第3水曜日に開催している .NET 系の勉強会です。
発表を中心として、発表でなくとも最近やった事や新しい情報などを参加者で共有している会です。

私は CakBuild というタイトルで話をしました。

最近、CakeBuild というものを知ったので、どんなものか調べてみている話です。

■ 次回予定

来月は 08月21日(水)に開催の予定です。

.NET に関心のある方、是非遊びに来てください。