অ্যাপ্লিকেশন অটো বিল্ড সংস্করণ


193

প্রতিবার একটি গো অ্যাপ্লিকেশন সংকলিত হওয়ার পরে কি স্বয়ংক্রিয়ভাবে কোনও গৌণ সংস্করণ নম্বর বাড়ানো সম্ভব?

আমি আমার প্রোগ্রামের অভ্যন্তরে একটি স্বয়ংসোধক বিভাগ সহ একটি সংস্করণ নম্বর সেট করতে চাই:

$ myapp -version
MyApp version 0.5.132

আমি নির্ধারিত সংস্করণ নম্বর 0.5, এবং 132 হওয়া একটি মান যা প্রতিবার বাইনারি সংকলিত হওয়ার পরে স্বয়ংক্রিয়ভাবে বৃদ্ধি পায়।

গো এ কি সম্ভব?

উত্তর:


337

গো লিংকার ( গো সরঞ্জাম লিঙ্ক ) এর একটি অনির্বাচিত স্ট্রিং ভেরিয়েবলের মান সেট করার একটি বিকল্প রয়েছে:

-X importpath.name=value
  Set the value of the string variable in importpath named name to

মান। নোট করুন যে 1.5 এর আগে এই বিকল্পটি দুটি পৃথক যুক্তি নিয়েছিল। প্রথম = চিহ্নে এটি এখন একটি যুক্তি বিভক্ত করে।

আপনার বিল্ড প্রক্রিয়াটির অংশ হিসাবে আপনি এটি ব্যবহার করে কোনও সংস্করণ স্ট্রিং ভেরিয়েবল সেট করতে পারেন। আপনি এটি goব্যবহার করে সরঞ্জামটির মাধ্যমে পাস করতে পারেন -ldflags। উদাহরণস্বরূপ, নিম্নলিখিত উত্স ফাইলটি দেওয়া:

package main

import "fmt"

var xyz string

func main() {
    fmt.Println(xyz)
}

তারপর:

$ go run -ldflags "-X main.xyz=abc" main.go
abc

main.minversionবিল্ড করার সময় বিল্ডের তারিখ এবং সময় নির্ধারণ করার জন্য :

go build -ldflags "-X main.minversion=`date -u +.%Y%m%d.%H%M%S`" service.go

আপনি যদি main.minversionএভাবে আরম্ভ না করে সংকলন করেন তবে এটিতে খালি স্ট্রিং থাকবে।


4
আমি go bouildপরিবর্তে ব্যবহার করা হলে সেই মানটি বাইনারিটিতে সংরক্ষণ করা হবে go run?
সেবাস্তিয়ান গ্রিগনোলি

6
go build -ldflags "-X main.minversion `date -u +.%Y%m%d%.H%M%S`" service.go
সেবাস্তিয়ান গ্রিগনোলি

4
goxc এটি আপনার জন্য করে: ডিফল্টরূপে এটি -ldflags "-Xmain.VERSION xxx -Xmain.BUILD_DATE কারেন্টডেটআইনিআইএসআই 8601" দিয়ে সংকলিত হয়, তবে আপনি যদি পছন্দ করেন তবে এই পরিবর্তনশীল নামগুলি কনফিগার করতে পারেন। Github.com/laher/goxc দেখুন ... (অস্বীকৃতি: আমি goxc লিখেছি)
laher

7
বিল্ডটাইম ভেরিয়েবল যুক্ত করার জন্য নতুন 1.5 সিনট্যাক্সের সাথে কাজ করার উদাহরণgo build -ldflags "-X 'main.buildtime=$(date -u '+%Y-%m-%d %H:%M:%S')'"
জোরপল

26
সম্পূর্ণ প্যাকেজের নাম প্রয়োজন তা লক্ষ্য করুন। আশানুরূপ কাজ go build -ldflags "-X pkg.version=123"করার সময় go build -ldflags "-X path/to/pkg.version=123"কাজ করবে না । আশা করি এটা সাহায্য করবে.
সাইক্যাংচেন

27

অতিরিক্তভাবে আমি কীভাবে গিট এবং একটি মেকফিল ব্যবহার করতে পারি তার একটি ছোট উদাহরণ পোস্ট করতে চাই:

--- Makefile ----

# This how we want to name the binary output
BINARY=gomake

# These are the values we want to pass for VERSION and BUILD
# git tag 1.0.1
# git commit -am "One more change after the tags"
VERSION=`git describe --tags`
BUILD=`date +%FT%T%z`

# Setup the -ldflags option for go build here, interpolate the variable values
LDFLAGS_f1=-ldflags "-w -s -X main.Version=${VERSION} -X main.Build=${BUILD} -X main.Entry=f1"
LDFLAGS_f2=-ldflags "-w -s -X main.Version=${VERSION} -X main.Build=${BUILD} -X main.Entry=f2"

# Builds the project
build:
    go build ${LDFLAGS_f1} -o ${BINARY}_f1
    go build ${LDFLAGS_f2} -o ${BINARY}_f2

# Installs our project: copies binaries
install:
    go install ${LDFLAGS_f1}

# Cleans our project: deletes binaries
clean:
    if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi

.PHONY: clean install

মেক ফাইল দুটি এক্সিকিউটেবল তৈরি করবে। একটি ফাংশন চালাচ্ছে একটি, অন্যটি প্রধান প্রবেশ হিসাবে দুটি ফাংশন গ্রহণ করবে:

package main

import (
        "fmt"
)

var (

        Version string
        Build   string
        Entry   string

        funcs = map[string]func() {
                "f1":functionOne,"f2":functionTwo,
        }

)

func functionOne() {
    fmt.Println("This is function one")
}

func functionTwo() {
    fmt.Println("This is function two")
}

func main() {

        fmt.Println("Version: ", Version)
        fmt.Println("Build Time: ", Build)

    funcs[Entry]()

}

তারপরে কেবল চালান:

make

তুমি পাবে:

mab@h2470988:~/projects/go/gomake/3/gomake$ ls -al
total 2020
drwxrwxr-x 3 mab mab    4096 Sep  7 22:41 .
drwxrwxr-x 3 mab mab    4096 Aug 16 10:00 ..
drwxrwxr-x 8 mab mab    4096 Aug 17 16:40 .git
-rwxrwxr-x 1 mab mab 1023488 Sep  7 22:41 gomake_f1
-rwxrwxr-x 1 mab mab 1023488 Sep  7 22:41 gomake_f2
-rw-rw-r-- 1 mab mab     399 Aug 16 10:21 main.go
-rw-rw-r-- 1 mab mab     810 Sep  7 22:41 Makefile
mab@h2470988:~/projects/go/gomake/3/gomake$ ./gomake_f1
Version:  1.0.1-1-gfb51187
Build Time:  2016-09-07T22:41:38+0200
This is function one
mab@h2470988:~/projects/go/gomake/3/gomake$ ./gomake_f2
Version:  1.0.1-1-gfb51187
Build Time:  2016-09-07T22:41:39+0200
This is function two

5
বা সরল: দুটি ভিন্ন ভিন্ন ডিরেক্টরিতে কেবল দুটি প্রধান করুন। এই সমাধানটি গুরুত্ব সহকারে বিবেচনা করা হয়নি বলে মনে হচ্ছে।
ডলমেন

26

-ldflagsআমার মিশ্রিত কমান্ড-লাইন অ্যাপ এবং লাইব্রেরি প্রকল্প তৈরি করার সময় আমার প্যারামিটারটি ব্যবহার করতে সমস্যা হয়েছিল , তাই আমি আমার অ্যাপ্লিকেশনটির সংস্করণ এবং বিল্ডের তারিখ সম্বলিত একটি গো সোর্স ফাইল তৈরি করতে একটি মেকফিল লক্ষ্য ব্যবহার করে শেষ করেছি:

BUILD_DATE := `date +%Y-%m-%d\ %H:%M`
VERSIONFILE := cmd/myapp/version.go

gensrc:
    rm -f $(VERSIONFILE)
    @echo "package main" > $(VERSIONFILE)
    @echo "const (" >> $(VERSIONFILE)
    @echo "  VERSION = \"1.0\"" >> $(VERSIONFILE)
    @echo "  BUILD_DATE = \"$(BUILD_DATE)\"" >> $(VERSIONFILE)
    @echo ")" >> $(VERSIONFILE)

আমার init()পদ্ধতিতে, আমি এটি করি:

flag.Usage = func() {
    fmt.Fprintf(os.Stderr, "%s version %s\n", os.Args[0], VERSION)
    fmt.Fprintf(os.Stderr, "built %s\n", BUILD_DATE)
    fmt.Fprintln(os.Stderr, "usage:")
    flag.PrintDefaults()
}

আপনি যদি কোনও বিল্ডের তারিখের পরিবর্তে একটি পরমাণু-বর্ধিত বিল্ড নম্বর চান, তবে আপনাকে সম্ভবত একটি স্থানীয় ফাইল তৈরি করতে হবে যাতে শেষ বিল্ড নম্বরটি থাকবে। আপনার মেকফিল ফাইলের বিষয়বস্তুগুলিকে ভেরিয়েবলের মধ্যে পড়বে, বাড়িয়ে দেবে version.go, তারিখের পরিবর্তে ফাইলটিতে সন্নিবেশ করত এবং নতুন বিল্ড নম্বরটি ফাইলে লিখত।


2
সুন্দর সমাধান। তবুও, আমি মনে করি আমি -ফ্ল্যাডফ্ল্যাজগুলির ঝামেলার কারণ খুঁজে পেয়েছি। যদি ভেরিয়েবলযুক্ত ফাইলটি-এক্স আপডেট করা থাকে তবে সংকলনটি ট্রিগার করে না এবং বাইনারিতে আপনার পুরানো সংস্করণ রয়েছে। আমার সমাধানটি ছিল একটি ছোট ফাইলকে স্পর্শ করার জন্য যা কেবলমাত্র ভেরিয়েবলযুক্ত -ldflags "-X ..." এর মাধ্যমে পুনরায় সেট করা যায়
ওয়াজেসিচ ক্যাকজমারেেক

20

প্যাকেজে ldflagsভেরিয়েবল সেট করতে ব্যবহার করুন main:

ফাইল সহ main.go:

package main

import "fmt"

var (
    version string
    build   string
)

func main() {
    fmt.Println("version=", version)
    fmt.Println("build=", build)
}

তারপরে চালান:

go run \
  -ldflags "-X main.version=1.0.0 -X main.build=12082019" \ 
  main.go

বিল্ড:

go build -o mybinary \
  -ldflags "-X main.version=1.0.0 -X 'main.build=$(date)'" \ 
  main.go

ldflagsএকটি non-mainপ্যাকেজে ভেরিয়েবল সেট করতে ব্যবহার করুন :

ফাইল সহ config.go:

package config

import "fmt"

var (
    Version string
)

func LogVersion() {
    fmt.Println("version=", Version)
}

আপনার ফাইলও লাগবে main.go:

package main

import (
    "fmt"
    "github.com/user/repo/config"
}

func main() {
    config.LogVersion()
}

প্রথমে আপনার বাইনারি তৈরি করুন:

go build -o mybinary main.go 

আপনি সেট করতে চান ভেরিয়েবলের পুরো পথটি সন্ধান করুন:

go tool nm <path_to_binary> | grep Version

আবার বাইনারি চালান এবং তৈরি করুন তবে এর সাথে ldflags:

go run \
  -ldflags "-X github.com/user/repo/config.Version=1.0.0" \
  main.go --version       


go build -o mybinary \
  -ldflags "-X github.com/user/repo/config.Version=1.0.0" \
  main.go     

Https://github.com/golang/go/wiki/GcToolchainTricks# অন্তর্ভুক্ত- বিল্ড-ইনফরমেশন- ইন- থি- এক্সকিউটেবল দ্বারা অনুপ্রাণিত


এছাড়াও যদি আপনি ব্যবহার করেন goreleaserতবে এই https://goreleaser.com/# using- the-main- version পড়ুন :

ডিফল্ট বুদ্ধিমান GoReleaser তিনটি ldflags সেট করে:

main.version: বর্তমান গিট ট্যাগ
main.commit: বর্তমান গিট কমিট SHA
মেইন ডেট: আরএফসি 3339 অনুসারে তারিখ


আপনি যদি এটিকে ক্রিয়াতে দেখতে চান: https://github.com/hoto/fuzzy-repo-finder/blob/master/pkg/config/config.go



12

উইন্ডোজ ওএসে নীচের প্রোগ্রামটি দেওয়া হয়েছে

package main

import "fmt"

var (
    version string
    date    string
)

func main() {
    fmt.Printf("version=%s, date=%s", version, date)
}

আপনি ব্যবহার করে নির্মাণ করতে পারেন

go build -ldflags "-X main.version=0.0.1 -X main.date=%date:~10,4%-%date:~4,2%-%date:~7,2%T%time:~0,2%:%time:~3,2%:%time:~6,2%"

তারিখ বিন্যাসটি আপনার পরিবেশটি echo %date%হ'ল Fri 07/22/2016এবং echo %time%তা হ'ল16:21:52.88

তারপরে আউটপুটটি হবে: version=0.0.1, date=2016-07-22T16:21:52

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.