我想构建我的 Go 存储库,以便在
myrepo/gotvm/*
时忽略 GOARCH=arm64
,并在任何其他情况下构建完整的存储库。
项目文件夹结构如下:
└── myrepo
├── go.mod
├── main.go
├── gotvm
│ ├── array.go
│ ├── device.go
│ └── gotvm.go
└── otherstuff
└── otherstuff.go
在 AMD64 上构建时一切正常:
GOOS=linux GOARCH=amd64 go build -o amdbuild main.go
基于 ARM64 构建
GOOS=linux GOARCH=arm64 go build -o armbuild main.go
package command-line-arguments
imports github.com/myrepo/gotvm: build constraints exclude all Go files in /HOMEDIR/myrepo/gotvm
当我使用
package gotvm
(array.go
, device.go
, gotvm.go
) 将以下行添加到每个文件的顶部时,情况也是如此:
//go:build amd64
// +build amd64`
我尝试过的其他步骤:
go clean -modcache
package gotvm
// go:build (darwin && cgo) || (linux && cgo)
//go:build amd64
// +build amd64`
这里有一个类似的问题:(模拟包) ,但这会忽略整个文件夹。我想忽略文件夹,条件是
ARCH
不是 arm64
。
TL;DR; 有没有办法将我的存储库交叉编译到 ARM64 和 AMD64?我想在 ARM64 版本中忽略 TVM。
规格:
go1.20.4 linux/amd64
将仅包含 package 子句的 go 文件添加到
gotvm
文件夹中可以解决此问题。例如,一个 doc.go
文件:
// This file is a workaround for the following issue when built with GOARCH=arm64:
//
// build constraints exclude all Go files in /HOMEDIR/myrepo/gotvm
package gotvm
但是当你遇到这个问题时,大多数时候,这意味着至少有一个文件导入了这个包,并且不排除这个文件
GOARCH=arm64
。也许您应该从此文件中删除导入(或者也排除此文件GOARCH=arm64
)。
我将添加一个演示来说明问题。这些是文件:
├── go.mod
├── gotvm
│ └── gotvm.go
└── main.go
go.mod:
module example.com/m
go 1.20
gotvm/gotvm.go:
//go:build amd64
package gotvm
import "fmt"
func F() {
fmt.Println("do awesome things using amd64")
}
main.go:
package main
import (
"fmt"
_ "example.com/m/gotvm"
)
func main() {
fmt.Println("Hello world!")
}
对于此演示,从
_ "example.com/m/gotvm"
中删除 main.go
或添加前面提到的 doc.go
文件即可解决该问题。我认为,最好从 _ "example.com/m/gotvm"
中删除 main.go
。