前書き

Goでは、build tag、またはビルド制約は、コードに追加される識別子であり、 `+ build +`プロセス中にファイルをパッケージに含めるタイミングを決定します。 これにより、同じソースコードからGoアプリケーションのさまざまなバージョンを構築し、それらを迅速かつ体系的に切り替えることができます。 多くの開発者はビルドタグを使用して、異なるオペレーティングシステム間の差異を考慮してコードの変更を必要とするプログラムなど、クロスプラットフォーム互換のアプリケーションを構築するワークフローを改善します。 ビルドタグはhttps://en.wikipedia.org/wiki/Integration_testing [統合テスト]にも使用されるため、統合コードとhttps://en.wikipedia.org/wiki/を使用してコードをすばやく切り替えることができます。 Mock_object [モックサービスまたはスタブ]、およびアプリケーション内のさまざまなレベルの機能セット用。

顧客の機能セットが異なるという問題を例として見てみましょう。 一部のアプリケーションを作成する場合、* Free Pro 、および Enterprise *レベルを提供するアプリケーションなど、バイナリに含める機能を制御することができます。 顧客がこれらのアプリケーションのサブスクリプションレベルを上げると、より多くの機能がロック解除されて利用可能になります。 この問題を解決するには、個別のプロジェクトを維持し、 `+ import +`ステートメントを使用して、プロジェクトの同期を保つようにします。 このアプローチは機能しますが、時間が経つと退屈でエラーが発生しやすくなります。 別のアプローチは、ビルドタグを使用することです。

この記事では、Goでビルドタグを使用して、サンプルアプリケーションのFree、Pro、およびEnterpriseの機能セットを提供するさまざまな実行可能バイナリを生成します。 それぞれに異なる機能セットがあり、無料版がデフォルトです。

前提条件

この記事の例を実行するには、次のものが必要です。

  • Goのインストール方法に従ってセットアップされたGoワークスペースローカルプログラミング環境のセットアップ]。

無料版の構築

ビルドタグなしで `+ go build +`を実行するときのデフォルトになるので、アプリケーションの無料版のビルドから始めましょう。 後で、ビルドタグを使用して、プログラムに他のパーツを選択的に追加します。

`+ src `ディレクトリで、アプリケーションの名前でフォルダーを作成します。 このチュートリアルでは、 ` app +`を使用します。

mkdir

このフォルダーに移動します。

cd

次に、 `+ main.go +`という名前のテキストエディターで新しいテキストファイルを作成します。

nano main.go

次に、アプリケーションの無料版を定義します。 次の内容を `+ main.go +`に追加します。

main.go

package main

import "fmt"

var features = []string{
 "Free Feature #1",
 "Free Feature #2",
}

func main() {
 for _, f := range features {
   fmt.Println(">", f)
 }
}

このファイルでは、https://www.digitalocean.com/community/tutorials/understanding-arrays-and-slices-in-go#slices [slice]という名前の + features +`を宣言するプログラムを作成しました。無料アプリケーションの機能を表すhttps://www.digitalocean.com/community/tutorials/an-introduction-to-working-with-strings-in-go[strings] アプリケーションの `+ main()+`関数はhttps://www.digitalocean.com/community/tutorials/how-to-construct-for-loops-in-go#looping-through-sequential-data-を使用しますtypes-with-rangeclause [+ for `は、 ` features `スライスをループして ` range +`にループし、画面で使用可能なすべての機能を印刷します。

ファイルを保存して終了します。 このファイルが保存されたので、記事の残りの部分で編集する必要はなくなりました。 代わりに、ビルドタグを使用して、そこからビルドするバイナリの機能を変更します。

プログラムをビルドして実行します。

go build
./

次の出力が表示されます。

Output> Free Feature #1
> Free Feature #2

プログラムは2つの無料機能を印刷し、アプリの無料版を完成させました。

これまでのところ、非常に基本的な機能セットを持つアプリケーションを作成しました。 次に、ビルド時にアプリケーションに機能を追加する方法を構築します。

「+ go build」を使用してプロ機能を追加する

これまでのところ、 `+ main.go `に変更を加えることは避けており、メインコードを変更せず、場合によっては壊すことなくコードを追加する必要がある一般的な実稼働環境をシミュレートしています。 ` main.go `ファイルを編集できないため、ビルドタグを使用して ` features +`スライスにさらに機能を注入するために別のメカニズムを使用する必要があります。

https://www.digitalocean.com/community/tutorials/understanding-init-in-go [+ init()+]関数を使用して追加する + pro.go +`という新しいファイルを作成しましょう+ features +`スライスへの機能:

nano pro.go

エディターがファイルを開いたら、次の行を追加します。

pro.go

package main

func init() {
 features = append(features,
   "Pro Feature #1",
   "Pro Feature #2",
 )
}

このコードでは、アプリケーションの `+ main()`関数の前にコードを実行するために ` init()`を使用し、続いて ` features `にPro機能を追加するために ` append()+`を使用しましたスライス。 ファイルを保存して終了します。

`+ go build`を使用してアプリケーションをコンパイルおよび実行します。

go build

現在のディレクトリには2つのファイル( + pro.go +`と `+ main.go +)があるため、 `+ go build +`は両方のファイルからバイナリを作成します。 このバイナリを実行します:

./

これにより、次の機能セットが提供されます。

Output> Free Feature #1
> Free Feature #2

このアプリケーションには、Pro機能とFree機能の両方が含まれています。 ただし、これは望ましくありません。バージョンに区別がないため、無料版には現在、Proバージョンでのみ使用できるはずの機能が含まれています。 これを修正するには、アプリケーションのさまざまな層を管理するコードを追加するか、ビルドタグを使用してGoツールチェーンにビルドする `+ .go +`ファイルと無視するファイルを指示します。 次のステップでビルドタグを追加しましょう。

ビルドタグの追加

ビルドタグを使用して、アプリケーションのProバージョンと無料バージョンを区別できるようになりました。

ビルドタグがどのように見えるかを調べることから始めましょう。

// +build

このコード行をパッケージの最初の行として配置し、「+」をビルドタグの名前に置き換えることにより、このパッケージを最終バイナリに選択的に含めることができるコードとしてタグ付けします。 ビルドタグを ` pro.go `ファイルに追加して、タグが指定されていない限り、 ` go build +`コマンドに無視するよう指示することで、これを実際に見てみましょう。 テキストエディターでファイルを開きます。

nano pro.go

次に、強調表示された次の行を追加します。

pro.go

package main

func init() {
 features = append(features,
   "Pro Feature #1",
   "Pro Feature #2",
 )
}

`+ pro.go `ファイルの先頭に、 ` // + build pro `の後に空白の改行を追加しました。 この末尾の改行は必須です。それ以外の場合、Goはこれをコメントとして解釈します。 ビルドタグ宣言は、 ` .go +`ファイルの最上部にもなければなりません。 ビルドタグの上にあるものは、コメントでさえありません。

++ build +`宣言は、これがコメントではなく、ビルドタグであることを `+ go build +`コマンドに伝えます。 2番目の部分は `+ pro +`タグです。 このタグを `+ pro.go +`ファイルの先頭に追加すると、 `+ go build`コマンドには + pro.go + ファイルが含まれ、 + pro + `タグが存在するようになります。

アプリケーションをコンパイルして再度実行します。

go build
./

次の出力が表示されます。

Output> Free Feature #1
> Free Feature #2

`+ pro.go `ファイルには ` pro +`タグが存在する必要があるため、ファイルは無視され、アプリケーションはそれなしでコンパイルします。

+ go build`コマンドを実行するとき、 + -tags + `フラグを使用して、引数としてタグ自体を追加することにより、コンパイルされたソースにコードを条件付きで含めることができます。 `+ pro +`タグに対してこれを行いましょう:

go build -tags pro

これは以下を出力します。

Output> Free Feature #1
> Free Feature #2
> Pro Feature #1
> Pro Feature #2

これで、 `+ pro +`ビルドタグを使用してアプリケーションをビルドするときにのみ追加機能を取得できます。

バージョンが2つしかない場合はこれで問題ありませんが、タグを追加すると複雑になります。 次のステップでアプリのエンタープライズバージョンを追加するには、ブールロジックで結合された複数のビルドタグを使用します。

ビルドタグブールロジック

Goパッケージに複数のビルドタグがある場合、タグはhttps://www.digitalocean.com/community/tutorials/understanding-boolean-logic-in-go [ブールロジック]を使用して互いに対話します。 これを実証するために、 `+ pro `タグと ` enterprise +`タグの両方を使用して、アプリケーションのエンタープライズレベルを追加します。

エンタープライズバイナリを構築するには、デフォルト機能、プロレベルの機能、およびエンタープライズ向けの新しい機能セットの両方を含める必要があります。 最初に、エディターを開き、新しいエンタープライズ機能を追加する新しいファイル、「+ enterprise.go +」を作成します。

nano enterprise.go

`+ enterprise.go `の内容は ` pro.go +`とほとんど同じに見えますが、新しい機能が含まれています。 ファイルに次の行を追加します。

enterprise.go

package main

func init() {
 features = append(features,
   "Enterprise Feature #1",
   "Enterprise Feature #2",
 )
}

ファイルを保存して終了します。

現在、「+ enterprise.go 」ファイルにはビルドタグがありません。「 pro.go 」を追加したときに学んだように、これは「 go.build 」を実行するとこれらの機能が無料版に追加されることを意味します。 ` pro.go `に対して、ファイルの先頭に ` // + build pro `と改行を追加して、 ` -tags pro `が使用されている場合にのみ含めるように ` go build +`に指示しました。 この状況では、目標を達成するために必要なビルドタグは1つだけです。 ただし、新しいエンタープライズ機能を追加する場合は、最初にPro機能も必要です。

最初に `+ pro `ビルドタグのサポートを ` enterprise.go +`に追加しましょう。 テキストエディターでファイルを開きます。

nano enterprise.go

次に、 `+ package main +`宣言の前にビルドタグを追加し、ビルドタグの後に改行を含めるようにします。

enterprise.go

package main

func init() {
 features = append(features,
   "Enterprise Feature #1",
   "Enterprise Feature #2",
 )
}

ファイルを保存して終了します。

タグなしでアプリケーションをコンパイルして実行します。

go build
./

次の出力が表示されます。

Output> Free Feature #1
> Free Feature #2

エンタープライズ機能は、無料版では表示されなくなりました。 それでは、 `+ pro +`ビルドタグを追加して、アプリケーションを再度ビルドして実行します。

go build -tags pro
./

次の出力が表示されます。

Output> Free Feature #1
> Free Feature #2
> Enterprise Feature #1
> Enterprise Feature #2
> Pro Feature #1
> Pro Feature #2

これはまだ必要なものではありません。Proバージョンをビルドしようとすると、エンタープライズ機能が表示されるようになりました。 これを解決するには、別のビルドタグを使用する必要があります。 ただし、 `+ pro `タグとは異なり、 ` pro `と ` enterprise +`の両方の機能が利用可能であることを確認する必要があります。

Goビルドシステムは、ビルドタグシステムでいくつかの基本的なブールロジックの使用を許可することにより、この状況を考慮します。

もう一度 `+ enterprise.go +`を開きましょう:

nano enterprise.go

+ pro`タグと同じ行に別のビルドタグ + enterprise`を追加します。

enterprise.go

// +build pro

package main

func init() {
 features = append(features,
   "Enterprise Feature #1",
   "Enterprise Feature #2",
 )
}

ファイルを保存して閉じます。

次に、新しい `+ enterprise`ビルドタグを使用してアプリケーションをコンパイルして実行します。

go build -tags enterprise
./

これにより、以下が得られます。

Output> Free Feature #1
> Free Feature #2
> Enterprise Feature #1
> Enterprise Feature #2

Pro機能が失われました。 これは、 `+ .go `ファイルの同じ行に複数のビルドタグを配置すると、 ` go build `がそれらを ` OR `ロジックを使用していると解釈するためです。 「 // + build pro enterprise」行を追加すると、「+ pro 」ビルドタグまたは「 enterprise」ビルドタグが存在する場合に「+ enterprise.go 」ファイルがビルドされます。 * both *を必要とするビルドタグを正しく設定し、代わりに ` AND +`ロジックを使用する必要があります。

両方のタグを同じ行に置く代わりに、別々の行に置くと、 `+ go build `は ` AND +`ロジックを使用してそれらのタグを解釈します。

もう一度 `+ enterprise.go +`を開き、ビルドタグを複数の行に分けましょう。

enterprise.go

package main

func init() {
 features = append(features,
   "Enterprise Feature #1",
   "Enterprise Feature #2",
 )
}

次に、新しい `+ enterprise`ビルドタグを使用してアプリケーションをコンパイルおよび実行します。

go build -tags enterprise
./

次の出力が表示されます。

Output> Free Feature #1
> Free Feature #2

それでもまだありません: `+ AND `ステートメントは両方の要素を ` true `とみなす必要があるため、 ` pro `と ` enterprise +`ビルドタグの両方を使用する必要があります。

もう一度試してみましょう。

go build -tags "enterprise pro"
./

次の出力が表示されます。

Output> Free Feature #1
> Free Feature #2
> Enterprise Feature #1
> Enterprise Feature #2
> Pro Feature #1
> Pro Feature #2

これで、複数の方法で同じソースツリーからアプリケーションを構築し、それに応じてアプリケーションの機能をロック解除できます。

この例では、新しい「+ // + build」タグを使用して「+ AND」ロジックを示しますが、ブールタグロジックをビルドタグで表す別の方法があります。 次の表には、ビルドタグの他の構文フォーマットの例と、それに相当するブール値が含まれています。

Build Tag Syntax Build Tag Sample Boolean Statement

Space-separated elements

// +build pro enterprise

pro OR enterprise

Comma-separated elements

// +build pro,enterprise

pro AND enterprise

Exclamation point elements

// +build !pro

NOT pro

結論

このチュートリアルでは、ビルドタグを使用して、どのコードをバイナリにコンパイルするかを制御できるようにしました。 最初に、ビルドタグを宣言し、それらを `+ go build +`で使用し、次に複数のタグをブールロジックと組み合わせました。 次に、無料版、プロ版、およびエンタープライズ版のさまざまな機能セットを表すプログラムを作成し、ビルドタグでプロジェクトを制御できる強力なレベルの制御を示しました。

ビルドタグの詳細については、https://golang.org/pkg/go/build/#hdr-Build_Constraints [Golang documentation on the subject]をご覧になるか、httpsを引き続きご覧ください。 //www.digitalocean.com/community/tutorial_series/how-to-code-in-go[How To Code in Goシリーズ]。