読者です 読者をやめる 読者になる 読者になる

【D言語】パッケージマネージャとしてのdub

D言語

前回の記事では、どちらかというとビルドツールとしてのdubの紹介になりました。今回は、パッケージマネージャとしてのdubを見てみます。


code.dlang.orgに、dubで使用出来るパッケージの一覧があります。vibe.dや、derelictなどの名前が見られます。


前回の記事に出てきたpackage.jsonの中に、dependenciesという項目がありました。ここに、パッケージ名とバージョンを追加することによって、そのパッケージを使用出来るようになります。


例として、ctpgパッケージを使ってみましょう。ctpgは、コンパイル時のパーサジェネレータです。


$ cd
$ dub init ctpg_test
Successfully created an empty project in '/home/〜〜〜/ctpg_test'.
$ cd ctpg_test

package.jsonを以下のように書きます。


{
    "name": "ctpg_test",
    "description": "An example project skeleton",
    "homepage": "http://example.org",
    "copyright": "Copyright © 2000, Your Name",
    "authors": [
        "Your Name"
    ],
    "dependencies": {
        "ctpg": "~master"
    }
}

バージョンの部分に書かれている~masterは、githubでのmasterブランチをバージョンとして使用するという意味です。そして、source/app.dで実際にctpgを使ってみます。


import std.stdio : writeln;
import std.conv : to;
import ctpg;

// 四則演算式を計算するパーサを生成する
mixin(genParsers(
q{
    @_setSkip(skip)

    // rootのパーサ
    int root = addExp $;

    // 加算と減算
    int addExp =
          mulExp !"+" addExp >> (lhs, rhs){ return lhs + rhs; }
        / mulExp !"-" addExp >> (lhs, rhs){ return lhs - rhs; }
        / mulExp;

    // 乗算と除算
    int mulExp =
          primary !"*" mulExp >> (lhs, rhs){ return lhs * rhs; }
        / primary !"/" mulExp >> (lhs, rhs){ return lhs / rhs; }
        / primary;

    // 数字と括弧でくくられた式
    int primary = !"(" addExp !")" / [0-9]+ >> to!int;
}));


void main()
{
    parse!root("4 *   5 + 2   * 11").value.writeln();
    parse!root("4 * ( 5 + 2 ) * 11").value.writeln();
}

実行すると、


$ dub
Checking dependencies in '/home/〜〜〜/ctpg_test'
The following changes will be performed:
Install ctpg ~master, userWide
Downloading ctpg ~master...
Installing ctpg ~master to /home/〜〜〜/.dub/packages/...
ctpg has been installed with version ~master
Building configuration "application", build type debug
Running dmd (compile)...
Linking...
Running /tmp/dub/1480571894/ctpg_test...
42
308

ちゃんとctpgが使えました!


同じようにして、vibe.dやderelictを使うこともできます。便利ですね。

担当:美馬(とても便利でよい)