Azure Developer CLI (azd) をソースコードからビルドする

# Azure Developer CLI (azd) とは

Azure Developer CLI (azd) は、米国時間の2022年7月12日にオープンソースプロジェクトとしてパブリック プレビューで公開されました。

- [Introducing the Azure Developer CLI (azd): A faster way to build apps for the cloud - Azure SDK Blog](https://devblogs.microsoft.com/azure-sdk/introducing-the-azure-developer-cli-a-faster-way-to-build-apps-for-the-cloud/)

現在のところ、Azureのコンピューティング サービス上にAzure Cosmos BDにアクセスするWebアプリ（Python、JavaScript/TypeScript、C#）のテンプレートを作成できて、Azureへのデプロイまでを支援するCLI コマンドとなっており、今後はJavaやAKSのテンプレートも用意される予定です。

- [Azure Developer CLI (azd) Preview とは | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/developer/azure-developer-cli/overview?WT.mc_id=AZ-MVP-5004244&tabs=nodejs)

# azd をソースコードからビルド

`azd` コマンドはGoで書かれているので、手動でコンパイルしてみました。

- [The Go Programming Language](https://go.dev/)

Goのバージョンは1.18以上が必要となっています。

- [azure-dev/CONTRIBUTING.md at main · Azure/azure-dev · GitHub](https://github.com/Azure/azure-dev/blob/main/cli/azd/CONTRIBUTING.md#prerequisites)

あと `git` コマンドも必要になります。

- [Git](https://git-scm.com/)

今回、使用しているOSは macOS + zsh のため、お手数ですがWindowsユーザーの方などは`ls`コマンドは`dir`コマンドになど、ご自分の環境に合わせて適宜読み替えをお願い致します。

#### 作業ディレクトリーを作成

どこでも良いです。（私のはGOPATH時代からの名残りです）

```zsh
% mkdir -p go/src/github.com/Azure                  
```

#### 作成した作業ディレクトリーに移動

```zsh
% cd go/src/github.com/Azure 
```

#### Azure Developer CLI のソースのクローンを取得

```zsh
% git clone https://github.com/Azure/azure-dev.git
```

#### azure-dev ディレクトリーに移動

```zsh
% cd azure-dev
```

#### 取得物を確認

```zsh
% ls
CONTRIBUTING.md README.md       cli             generators      magefile.go
LICENSE         SECURITY.md     eng             go.mod          schemas
NOTICE.txt      assets          ext             go.sum          templates
```

ここで `magefile.go` ファイルなるものを発見。中身を見てみると、見慣れないディレクティブながら、mainパッケージっぽい模様。

```go
//go:build mage
// +build mage

package main
...
```

通常の `go build` コマンドでビルドしている＆できる感じ。

```go
...
func (a AZD) Build(ctx context.Context) error {
        cmdStr, cmd := runIn(
                ".",
                "go",
                "build",
                "-o",
                "./bin/azd",
                "./cli/azd",
        )
        fmt.Println(cmdStr)
        return cmd()
}
...
```

気になって調べたところ、「Mage」というビルドツール用のファイルのようです。

- [Mage :: Mage](https://magefile.org/)

Mageは、MakefileのようなターゲットをGoの関数で書くことができるそうで、私は今回はじめて知り得ました。

- [Goで書けるタスクランナーMageが快適すぎて捗る - Qiita](https://qiita.com/townewgokgok/items/faad9327927947646a23)

#### カレントディレクトリーを２つ上（go/src/github.com/）に移動

```zsh
% cd ../..
```

#### Mage のクローンを取得

ついでに(?) mage も手動でコンパイルします。

```zsh
% git clone https://github.com/magefile/mage
```

#### mage ディレクトリーに移動

```zsh
% cd mage
```

#### mageをコンパイルしてインストールするブートストラップを実行

```zsh
% go run bootstrap.go
```

#### mage コマンドがインストールされていることを確認

```zsh
% mage -version
Mage Build Tool v1.13.0-8-g26cdb5c
Build Date: 2022-07-23T14:13:43+09:00
Commit: 26cdb5c
built with: go1.18.4
```

#### azure-dev に移動

```zsh
% cd ../Azure/azure-dev
```

#### mage コマンドを実行

`magefile.go` ファイルの内容が読み込まれて、実行できるターゲットが提示されます。

```zsh
% mage
Targets:
  azd:build    
  azd:test     
```

#### buildターゲットを実行

ここでは、`azd` コマンドをビルドする `azd:build` を指定して実行します。

```zsh
% mage azd:build
/usr/local/go/bin/go build -o ./bin/azd ./cli/azd
```

#### azd コマンドがビルドされていることを確認

```zsh
% ./bin/azd version
azd version 0.0.0-dev.0 (commit 0000000000000000000000000000000000000000)
```

バージョン値は、本家ではCIにて注入されます。

- cli/azd/internal/version.goの11〜12行目

```go
// Version is the version string printed out by the `Version` command.
// It's updated using ldflags in CI.
```

# さいごに

Azure Developer CLI (azd) では、各プログラミング言語やサービスのテンプレートは、これから＆追加可能なので、皆さんもチャレンジしてみてください。

Goでの対応は難しいと思うので、しばらくは `azd` 本体へのチャレンジですかね...