
我想构建我的 go 存储库,以便在 goarch=arm64 时忽略 myrepo/gotvm/* 并在任何其他情况下构建完整的存储库。
项目文件夹结构如下:
└── 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 -modcachepackage 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!")
}
对于此演示,从 main.go 中删除 _ "example.com/m/gotvm" 或添加前面提到的 doc.go 文件即可解决该问题。我认为,最好从 main.go 中删除 _ "example.com/m/gotvm" 。
以上就是如何在构建 ARM64 二进制文件时忽略gotvm的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号