특정buildtag이 있는 상황에서 처리

2407 단어 Go
Go에서 구축이나 테스트를 할 때buildtag라고 불리는 로고를 통과할 수 있습니다.
buildtag을 사용하면 구축할 파일을 전환할 수 있습니다.
이번에는buildtag을 지정한 상태에서만 함수를 실행하는 조수 함수와 이 조수 함수 코드를 생성하는 명령을 패키지화했습니다.

buildtag 처리 방법


buildtag을 지정하거나 지정하지 않은 상태에서 처리합니다. 어떻게 쓰시겠습니까?
예를 들어 우리는'debug'이 교부되었을 때go build -tags "debug"만 유효한 상황을 고려할 것이다.

일반적인 방법


주석에 기술Build Constraints.
myapp_debug.go
// +build debug

func init() {
    app.InitDebugLog()
}
나는 이렇게 쓰는 것이 가장 이해하기 쉽다고 생각한다.

나른한 작법


아래의 사람들을 위해 이buildcond 포장을 만들었습니다.

장점

  • 일일이 다른 파일을 만들고 싶지 않아
  • 초기화 처리를 여러 파일로 나누는 것을 좋아하지 않는다
  • (+build의 쓰기를 잊어버린 것 같다)
  • 예제


    myapp.go import "github.com/shu-go/buildcond/cond" func main() { // init hogehoge // : cond.IfDebug(func() { app.InitDebugLog() }) } go get github.com/shu-go/buildcond/... ※ 마지막 "/..."필요한 거야. 함수buildcond/cond.IfDebug에 debug 태그가 있는 구문인지 여부를 판단합니다. debug이면 매개 변수 함수를 호출합니다. 그렇지 않으면 호출하지 않습니다. 어려운 일은 고려하지 않아도 구축 조건을 고려한 코드를 기술할 수 있다. 결점 하지만 단점도 있다. IfDebug 가 실행되지 않아도 결과적으로 호출되므로 속도가 떨어집니다. 바이너리에는 불필요한 코드가 포함되어 있다 환경 의존 코드를 포함하면 구축할 수 없습니다 유형 정의는 변경할 수 없습니다. 예에서 보듯이 추가로 처리할 수 있는 처리를 전환하는 데 사용하는 것이 가장 적합하다고 생각합니다. 명령buildcond buildcond는 명령buildcond를 첨부합니다. 이 명령을 사용하면 마음에 드는buildtag의 원본 코드를 판단할 수 있습니다. 이 명령은 매개 변수에 지정한 탭의 코드와 비코드의 코드를 생성합니다. 위 예에 나타난 함수 IfDebug는 명령으로 생성됩니다. //go:generate buildcond --tag=debug --pkg=cond // 엄밀히 말하면 이렇게 해석한다... go:generate buildcond] g=debug-pkg = conte-output=cond 텍스트 / template를 사용하여 원본 파일을 만드는 것은 매우 간단합니다. 기존 원본 파일을 분석하지 않고 매번 대상 파일을 덮어씁니다. 파일 단위로 정해진 코드를 뱉는 정도여서 AST도 보지 않았다. 손에 넣은 곳을 말하자면template다.심지어 펑크맵을 자본화하기도 했다. funcMap := template.FuncMap{ "capitalize": strings.Title, } templ, err := template.New("tag").Funcs(funcMap).Parse(templText) // : //templText의 내용(일부) func If{{capitalize .Tag}}(f func()) {

    좋은 웹페이지 즐겨찾기