dub v1.23.0/Support dependencies as git url with exact commit

# はじめに

dub [v1.23.0](https://github.com/dlang/dub/releases/tag/v1.23.0)が9月にリリースされました。
その中に、 `Support dependencies as git url with exact commit` とあったので実際に試してみました。

# 使い方

使い方はリリースノートに書いてある通りですが、実例をdmanbotから抜粋します。

[before](https://github.com/simdnyan/dmanbot/blob/1f720ae26bd3748543bed81cfba3a9cfbe56e50c/dub.json#L8):

```dub.json
{
	"dependencies": {
		"twitter4d": {
			"path": "./twitter4d"
		}
	}
}
```

[after v1.23.0](https://github.com/simdnyan/dmanbot/blob/7d9c491c99c94420c80bef3df4d3651190b9f041/dub.json#L11-L14):

```dub.json
{
	"dependencies": {
		"twitter4d": {
			"repository": "git+https://github.com/simdnyan/twitter4d.git",
			"version": "72142f69173fb1914263eaff3f830b786a6cd6e0"
		}
	}
}
```

dmanbotでは[twitter4d](https://code.dlang.org/packages/twitter4d)で[dlang-requests](https://code.dlang.org/packages/requests)を使うためにforkしたリポジトリをgit submoduleで参照して使っていましたが、v1.23.0以降からはdubで直接リポジトリを指定しています。なんだかんだgitの操作は煩わしいので、パッケージマネージャが隠蔽してくれるのは非常にありがたいです。

ここで参照しているtwitter4dは`~/.dub/packages/twitter4d-72142f69173fb1914263eaff3f830b786a6cd6e0/`に保存されていました。

## Single-file packages

もちろん、[Single-file packages]()でも有効です。
[以前の記事](https://qiita.com/simd_nyan/items/fa7e9ba2e64bf40b37d6)の例は以下のように書き換えることができます。

```dlang_requests.d
#!/usr/bin/env dub                                                                                          
/+ dub.sdl:                                                                                                 
name "dlang_requests"                                                                                       
dependency "requests" repository="git+https://github.com/ikod/dlang-requests.git" version="bcbf3505a442770279c598023386c0bde70e8266”           
+/                                                                                                          
import std.stdio,                                                                                           
       std.getopt,                                                                                          
       requests;                                                                                            
                                                                                                            
string url = "http://example.com/";                                                                         
                                                                                                            
void main(string[] args)                                                                                    
{                                                                                                           
  getopt(args, "url", &url);                                                                                
                                                                                                            
  auto rs = Request().get(url);                                                                             
  writeln(rs.responseBody);                                                                                 
}                                                                                                           
```
実行方法は変わらず、`dub run --single dlang_requests.d -- --url=http://qiita.com`もしくは`./dlang_requests.d --url=http://qiita.com`でパラメータを与えて実行できます。

# 余談
dubのバージョンがv1.23.0以前だと`Invalid SemVer format`と怒られます。まずはバージョンを確認しましょう。

```
$ dmd --version
DMD64 D Compiler v2.094.0
Copyright (C) 1999-2020 by The D Language Foundation, All Rights Reserved written by Walter Bright
$ dub --version
DUB version 1.23.0, built on Sep 22 2020
```

# 最後に

いかがでしたか？
使い方で挙げた実例以外では、プライベートライブラリ等、[dub](https://code.dlang.org/)にアップできないケースで有用かと思います。是非活用してみて下さい。