Windows Autopilotにデバイスを手動でオンボードする方法 – パート2

紹介

Go言語において、ビルドタグやビルド制約として、コードに追加される識別子があり、ビルドプロセス中にどのような时机にファイルがパッケージに含まれるべきか決定します。これにより、同じソースコードからあなたのGoアプリケーションの異なるバージョンを構築することができ、迅速で組織化された方法でそれらを切り替えることができます。多くの開発者がビルドタグを使用して、クロスプラットフォーム互換性のあるアプリケーションの構築 workflow を改善するために、例えば、異なる操作系统間の変化に応じてコード変更を必要とするプログラムなどのアプリケーションに対してはまとめて使用します。ビルドタグはまた、統合テストのために使用されます。これにより、統合コードとモックサービスやスタブのコードを迅速に切り替えることができます。また、アプリケーション内で異なる機能セットのレベルを切り替えることもできます。

客户の特徴集が異なる問題を見ています。例えば、某些应用程序可能需要控制二进制中应包含哪些功能,例如提供免费专业版企业版的应用程序。随着客户增加他们的订阅级别,更多功能解锁并可用。为了解决这个问题,您可以保持不同的项目,并通过使用import语句来尝试同步它们。虽然这种方法可行,但随着时间的推移,它将变得乏味且容易出现错误。另一种方法是使用构建标记。在本文中,您将使用Go中的构建标记生成具有Free、Pro和企业版功能的示例应用程序的不同可执行文件。每个都将具有不同的一组可用功能,其中Free版本是默认的。

要遵循本教程中的示例,您需要:

先决条件

要遵循本教程中的示例,您需要:

  • 已经按照如何安装Go并设置本地编程环境设置好Go工作区。

    ### 1. 准备

    #### 1.1. 安装依赖项

    为了编译我们的应用程序,我们需要确保我们拥有必要的工具和库。首先,让我们使用`go get`命令来安装所需的包:

    “`bash
    go get -u github.com/golang-tools/cmd/gofmt
    “`

    这个命令会下载并安装`gofmt`包,这是一个用于格式化Go源代码的工具。接下来,我们将创建一个新目录来存储我们的项目文件。假设你想要将项目命名为`example-app`,你可以使用以下命令:

    “`bash
    mkdir example-app && cd example-app
    “`

    现在,你已经处于项目的根目录中了。接下来,我们将创建一个`main.go`文件,这是Go应用程序的主入口点。

無料バージョンの構築

まず、アプリケーションの無料バージョンを構築しましょう。これは、go buildコマンドを実行する際にビルドタグを指定しない場合のデフォルトです。後で、ビルドタグを使用してプログラムに他の部分を選択的に追加します。

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

  1. mkdir app

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

  1. cd app

次に、テキストエディタで新しいテキストファイルを作成し、名前をmain.goにします:

  1. 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)
  }
}

このファイルでは、featuresという名前のスライスを作成し、無料アプリケーションの機能を表す2つの文字列を保持しています。main()関数は、featuresスライスをforループでrangeして、すべての利用可能な機能を画面に表示します。

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

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

  1. go build
  2. ./app

以下の出力が得られます:

Output
> Free Feature #1 > Free Feature #2

プログラムは、アプリの無料バージョンを完成させるために、2つの無料機能を出力しました。

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

プロ機能を追加するための go build

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

新しいファイルを pro.go という名前で作成し、init() 関数を使用して features スライスにさらに機能を追加します:

  1. 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を使用します:

  1. go build

現在のディレクトリには2つのファイルがあります(pro.gomain.go),go buildはこれらの両方からバイナリを作成します。このバイナリを実行してください:

  1. ./app

これにより、以下の機能セットが得られます:

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

アプリケーションには今やProおよびFreeの機能が含まれています。しかし、これは望ましくありません。バージョン間の区別がないため、FreeバージョンにはProバージョンでのみ利用可能な機能が含まれています。これを修正するためには、アプリケーションの異なるティアを管理するためのさらなるコードを追加するか、Goツールチェーンにどの.goファイルをビルドし、どのファイルを無視するかを伝えるためにビルドタグを使用することができます。次のステップでビルドタグを追加しましょう。

ビルドタグの追加

今やビルドタグを使用して、アプリケーションのProバージョンとFreeバージョンを区別することができます。

まず、ビルドタグがどのように見えるかを確認しましょう:

// +build tag_name

このコード行をパッケージの最初の行として配置し、tag_nameをあなたの構築タグの名前に置き換えることで、このパッケージを最後のバイナリに選択的に含めることができるコードとしてタグを付けます。これを动作させるために、pro.goファイルに構築タグを追加し、go buildコマンドによってタグが指定されない限り無視するようにしましょう。テキストエディタでファイルを開いてください:

  1. nano pro.go

次に、以下の強調表示された行を追加してください:

pro.go
// +build pro

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ファイルのみを含めます。

アプリケーションを再编译して実行します:

  1. go build
  2. ./app

以下の出力が表示されます:

Output
> Free Feature #1 > Free Feature #2

なぜなら、pro.goファイルはproタグが存在することを要求しているからです。ファイルは無視され、タグが存在しない限りアプリケーションはこれを含んでいません。

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

  1. go build -tags pro

これは以下のように翻訳されます。

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

今、私たちはproビルドタグを使用してアプリケーションを構築する時にのみ追加機能を得ることができます。

これは2つのバージョンだけであれば大丈夫ですが、タグを追加すると複雑になります。次の手順で私たちのアプリのEnterpriseバージョンを追加するために、布尔逻辑を使用して複数のビルドタグを結合することにします。

ビルドタグ布尔逻辑

Goパッケージに複数のビルドタグがある場合、タグは布尔逻辑を使用して互いに影響を与えます。これを示すために、私たちはproタグとenterpriseタグを使用して Enterpriseレベルのアプリケーションを追加します。

Enterpriseバイナリを構築するためには、デフォルトの機能、Proレベルの機能、そしてEnterprise用の新しい機能セットを全て含める必要があります。まず、エディタを開き、新しいファイルenterprise.goを作成し、新しいEnterprise機能を追加するようにすることにします。

  1. 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 と改行をファイルの先頭に追加して、go build-tags pro が使用された場合にのみ含まれるべきだと指示しました。この場合、目標を達成するためには1つのビルドタグだけで十分です。しかし、新しいエンタープライズ機能を追加する際には、まずプロ機能をお持ちしている必要があります。

まず、enterprise.gopro ビルドタグのサポートを追加しましょう。テキストエディタでファイルを開きます:

  1. nano enterprise.go

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

enterprise.go
// +build pro

package main

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

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

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

  1. go build
  2. ./app

以下の出力が得られます:

Output
> Free Feature #1 > Free Feature #2

エンタープライズ機能はもはやフリーバージョンに表示されません。今度は pro ビルドタグを追加して、再度アプリケーションをビルドして実行します:

  1. go build -tags pro
  2. ./app

以下の出力が得られます:

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

これはまだ私たちが必要としているものとはまったく异なります。エンタープライズ機能がプロバージョン構築時に表示されるようになっています。これを解決するためには、別のビルドタグを使用する必要があります。pro タグとは異なり、今度は proenterprise の両方の機能が利用可能であることを確認する必要があります。

Goのビルドシステムは、ビルドタグシステムに基本的なブール論理を使用することで、この状況に対応しています。

enterprise.goを再度開きましょう:

  1. nano enterprise.go

もう一つのビルドタグenterpriseproタグの同一行に追加します:

enterprise.go
// +build pro enterprise

package main

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

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

今、新しいenterpriseビルドタグでアプリケーションをビルドして実行しましょう。

  1. go build -tags enterprise
  2. ./app

これにより以下のようになります:

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

これでPro機能が失われてしまいました。これは、.goファイルの同一行に複数のビルドタグを置くと、go buildがそれらをOR論理で解釈するからです。// +build pro enterpriseを追加したことにより、enterprise.goファイルはどちらか一つのビルドタグが存在する場合にビルドされるようになりました。正しくビルドタグを設定することで、両方を必要とし、AND論理を使用することができます。

同一行に両方のタグを置く代わりに、別の行にそれぞれのタグを置くことができます。そうすると、go buildはそれらのタグをAND論理で解釈します。

再度enterprise.goを開き、ビルドタグを別の行に分けてみましょう。

enterprise.go
// +build pro
// +build enterprise

package main

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

これで新しいenterpriseビルドタグでアプリケーションをビルドして実行しましょう。

  1. go build -tags enterprise
  2. ./app

以下の出力が受信されます:

Output
> Free Feature #1 > Free Feature #2

まだ正しくありません:ANDステートメントは両方の要素がtrueとして考慮される必要がありますので、proおよびenterpriseの両方のビルドタグを使用する必要があります。

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

  1. go build -tags "enterprise pro"
  2. ./app
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

結論

このチュートリアルでは、ビルドタグを使用して、アプリケーションのコードの中で何をコンパイルして binary に含めるかを制御することができました。まず、ビルドタグを宣言してgo buildと共に使用し、2つ以上のタグを論理的に結合しました。その後、Free、Pro、Enterprise バージョンの異なる機能セットを表すプログラムを構築し、ビルドタグがプロジェクト上で与える強力なコントロールレベルを示しました。

ビルドタグについてもっと学びたい場合は、Golang 文档に基づいて探査したり、Go 言語でコードする方法のシリーズを続けて学ぶことができます。

Source:
https://www.digitalocean.com/community/tutorials/customizing-go-binaries-with-build-tags