Edited at

Dockerを使ったD言語のワンライナービルド

More than 1 year has passed since last update.


はじめに

シェル芸はロマンです。

Dockerを使ってワンライナーで環境を汚さずにD言語のプロジェクトをビルドする方法を紹介します。


TL;DR

d-mansay で試します。

$ ls -1a

.
..
.dub
.git
.gitignore
README.md
dub.json
dub.selections.json
source

$ docker run --rm -v $PWD:/src -w /src dlanguage/dmd:latest dub -- ワンライナーだよ

Fetching east_asian_width 1.0.0 (getting selected version)...
Performing "debug" build using dmd for x86_64.
east_asian_width 1.0.0: building configuration "library"...
d-mansay ~master: building configuration "say"...
Linking...
Running ./d-mansay ワンライナーだよ
__________________
< ワンライナーだよ >
------------------
\ _ _
\ (_) (_)
/______ \
\\(O(O \/
| | | |
| |_| |
/______/
< >
(_) (_)

$ ls -1a

.
..
.dub
.git
.gitignore
README.md
d-mansay
dub.json
dub.selections.json
source
$ ./d-mansay Ubuntuだよ
____________
< Ubuntuだよ >
------------
\ _ _
\ (_) (_)
/______ \
\\(O(O \/
| | | |
| |_| |
/______/
< >
(_) (_)

バイナリが出力されます。

ビルドに使ったコンテナと同じアーキテクチャであればそのまま実行できます。


注意点


  • 出力されるバイナリのパーミッションはコンテナのユーザーに依存します。

  • 依存関係がないプロジェクト前提です。dmanbotは以下のようにビルドできません。

$ docker run --rm -it -v `pwd`:/src -w /src dlanguage/dmd:latest dub build

Fetching dyaml 0.6.3 (getting selected version)...
Fetching tinyendian 0.1.2 (getting selected version)...
Fetching twitter4d 0.0.70 (getting selected version)...
Fetching mysql-d 0.3.3 (getting selected version)...
Fetching dunit 1.0.12 (getting selected version)...
Performing "debug" build using dmd for x86_64.
tinyendian 0.1.2: building configuration "library"...
dyaml 0.6.3: building configuration "library"...
mysql-d 0.3.3: building configuration "mysql-d"...
twitter4d 0.0.70: building configuration "library"...
dmanbot ~master: building configuration "application"...
Linking...
/usr/bin/ld: cannot find -lmysqlclient
/usr/bin/ld: cannot find -lcurl
collect2: error: ld returned 1 exit status
Error: linker exited with status 1
dmd failed with exit code 1.


おまけ

宗教上の理由等でGoをインストールしていない環境でも、go getを使ってバイナリを取得できます。

$ docker run --rm -v ~/bin:/go/bin golang:1.9.2-stretch go get github.com/adamryman/gophersay

$ gophersay
------------------------
Don't panic.
------------------------
\
\
\ ,_---~~~~~----._
_,,_,*^____ _____``*g*\"*,
/ __/ /' ^. / \ ^@q f
[ @f | @)) | | @)) l 0 _/
\`/ \~____ / __ \_____/ \
| _l__l_ I
} [______] I
] | | | |
] ~ ~ |
| |
| |