高朗大厦多平台问题

我正在构建一个Go应用程序,我想同时为Linux和Windows构建该应用程序.对于Windows版本,我希望它能够作为Windows服务进行安装.因此,在我的应用程序中,我包含了以下包:

golang.org/x/sys/windows/svc
golang.org/x/sys/windows/svc/debug
golang.org/x/sys/windows/svc/eventlog
golang.org/x/sys/windows/svc/mgr

它在Windows上构建得很好,安装服务也没有任何问题.但当我try 为Linux构建它时:

GOOS=linux GOARCH=amd64 go build -o app-amd64-linux

package github.com/user/app
    imports golang.org/x/sys/windows/svc: build constraints exclude all Go files in 
C:\Users\User\go\pkg\mod\golang.org\x\sys@v0.0.0-20220728004956-3c1f35247d10\windows\svc\package github.com/user/app
    imports golang.org/x/sys/windows/svc/debug: build constraints exclude all Go files in 
C:\Users\User\go\pkg\mod\golang.org\x\sys@v0.0.0-20220728004956-3c1f35247d10\windows\svc\debug\package github.com/user/app
    imports golang.org/x/sys/windows/svc/eventlog: build constraints exclude all Go files in 
C:\Users\User\go\pkg\mod\golang.org\x\sys@v0.0.0-20220728004956-3c1f35247d10\windows\svc\eventlog\package github.com/user/app
    imports golang.org/x/sys/windows/svc/mgr: build constraints exclude all Go files in 
C:\Users\User\go\pkg\mod\golang.org\x\sys@v0.0.0-20enter code here220728004956-3c1f35247d10\windows\svc\mgr

在代码中,我判断并仅在应用程序作为Windows服务运行时才使用这些包.有没有办法忽略这些错误?或者仅在为Windows构建时才导入它们?或者,也许我可以在Go.mod中更改为只需要Windows上的那些?

推荐答案

作为一种解决办法,您可以使用构建构造器:

https://pkg.go.dev/go/build#hdr-Build_Constraints

蒂姆·库珀在这post篇文章中详细回答了如何实现这些目标:

玩.

package main

func main() {
    println("main()")
    conditionalFunction()
}

a、 go

// +build COMPILE_OPTION

package main

func conditionalFunction() {
    println("conditionalFunction")
}

B.go

// +build !COMPILE_OPTION

package main

func conditionalFunction() {
}

输出:

*% go build -o example ; ./example
main()

% go build -o example -tags COMPILE_OPTION ; ./example
main()
conditionalFunction*

为了不弄丢,我把答案一对一地抄了下来.如果这不是我所希望的,可能会有人纠正我.

Go相关问答推荐

在保留额外参数的同时解封YAML

Pulumi-S3-当策略依赖于访问点时,如何将AccesspintPolicy附加到访问点

Go在使用HTTP代理时如何处理DNS请求?

带有条件的for循环中缺少RETURN语句

如何使用我的 struct 化日志(log)记录格式使人panic ?

如何使用 Go 连接到非默认 firestore 数据库?

Golang:访问any类型泛型上的字段

如何获取集群外go Kubernetes客户端的当前命名空间?

nixOS 上的 Nginx 反向代理在try 加载 css/js 时返回 404

如何在正则表达式中使整个单词可选?

如何将字节文件高效地读入int64切片?

如何从Go项目连接Microsoft Access数据库?

Secrets Manager Update Secret - Secret String 额外的 JSON 编码

在 Golang 中查看目录是否可写的跨平台方式?

通过多阶段构建复制到 Docker 容器中时找不到文件

缺少签名帮助文档

使用 golang 生成 vim

具有近似约束的函数值导致的实例化失败

函数参数的判断顺序是什么?

Beego - 我需要context.Context而不是 Beego 上下文