2016-03-08 61 views
3

假设我有一个基于哪个操作系统的软件,并且在某些情况下,我想使用哪个发行版来说一个Systemd客户端软件包vs一个Upstart客户端软件包vs一个sysv客户端软件包与一个启动客户端软件包。是否有可能有选择地导入每个软件包,所以我只导入我需要的每个操作系统/发行版我正在创建?或者我必须为每个操作系统/发行版导入每个软件包?我可以根据我正在构建的操作系统导入Golang软件包吗?

回答

6

Package build

Build Constraints

一次构建约束,也被称为构建标签,是一个行注释是 开始

// +build 

列出的条件下,一个文件应该包含在 包中。约束可能出现在任何类型的源文件中(不仅仅是 Go),但它们必须出现在文件的顶部附近,其前面只有 空行和其他行注释。这些规则意味着在Go文件 中,构建约束必须出现在package子句之前。

要区分构建约束和包文档,构建约束的系列 必须后跟一个空行。

构建约束被评估为空间分隔选项的OR; 每个选项评估为逗号分隔项的AND;和 每个术语都是一个字母数字字,或者以!开头,否定。 即,构建约束:

// +build linux,386 darwin,!cgo 

对应于布尔公式:

(linux AND 386) OR (darwin AND (NOT cgo)) 

的文件可以具有多个生成约束。整体约束条件是个体约束的AND。也就是说,构建约束:

// +build linux darwin 
// +build 386 

对应于布尔公式:

(linux OR darwin) AND 386 

在一个特定的构建,下面的话是满意:

- the target operating system, as spelled by runtime.GOOS 
- the target architecture, as spelled by runtime.GOARCH 
- the compiler being used, either "gc" or "gccgo" 
- "cgo", if ctxt.CgoEnabled is true 
- "go1.1", from Go version 1.1 onward 
- "go1.2", from Go version 1.2 onward 
- "go1.3", from Go version 1.3 onward 
- "go1.4", from Go version 1.4 onward 
- "go1.5", from Go version 1.5 onward 
- "go1.6", from Go version 1.6 onward 
- any additional words listed in ctxt.BuildTags 

如果一个文件名,在剥离扩展名和可能的_test后缀后,匹配以下任何一种模式:

*_GOOS 
*_GOARCH 
*_GOOS_GOARCH 

(例如:source_windows_amd64.go)其中GOOS和GOARCH分别表示任何已知 操作系统和架构的值,则 文件被认为具有需要 这些术语(除了任何明确的限制的隐式构建约束在文件中)。

从正在考虑构建保持文件:

// +build ignore 

(其它任何不满意的话也能发挥作用,但“忽略”是 传统。)

要只建一个文件使用CGO时,只在Linux和OS X:

// +build linux,cgo darwin,cgo 

这样的文件,通常与其它文件执行 配对对于其它系统,在这种情况下将 进行约束默认功能:只有当 构建软件包的Windows将包括

// +build !linux,!darwin !cgo 

命名一个文件dns_windows.go将导致它;同样,只有在为32位x86构建包时,math_386.s将包含 。

除了android标签和文件,使用GOOS = android匹配构建标签和文件,至于GOOS = linux 。

使用构建约束。

使用一个包含多个文件的包。每个文件专门针对特定的操作系统,体系结构等组合。

相关问题