2015-02-09 38 views
11

我正在Go編寫一個庫。我打算分發它,並且主要需求爲',沒有源代碼'。直接使用二進制包

爲了測試,我已經創建了兩個工作空間一樣之後,

WS1

  • 斌/
  • PKG/linux_amd64/lib.a
  • 的src/lib中/ src.go

WS2

  • 倉/
  • PKG/
  • 的src /主/ main.go

我的第一工作區(WS1)是實際虛設庫,它具有一定的實用功能。第二個工作區(WS2)具有使用WS1中的程序包(lib.a)的主要功能。

一切都很好,直到我從WS1中移除源代碼。如果我刪除WS1目錄/lib/src.go,我去構建過程中收到以下錯誤,

main.go:5:2:在任何的找不到包「LIB」: 在/ usr /本地/ GO/src目錄/包裝/ lib目錄(由$ GOROOT)../Testing/ws1/src/lib (從$ GOPATH)

上述消息表示我們,我們應該保持源文件也是如此。 單獨預編譯的二進制包不能直接使用

根據在線提出的一些建議,我們可能會保留一些虛擬源,其時間戳值小於二進制包的時間戳。但是,這似乎並不是我們可行的解決方案。不幸的是,如果虛擬源的時間戳得到更新會發生什麼?

我看到這裏討論類似的問題, https://github.com/golang/go/issues/2775

我的問題:

  1. 分發源是Golang唯一的可能性?

  2. 爲什麼Go沒有提供直接使用'.a'文件的規定?

  3. 如果要保持Go的源代碼是強制性的,爲什麼這個小東西是 在Go的任何地方都沒有提到? (或)我在這裏錯過了什麼?

在此先感謝您的幫助!

回答

10

Go編譯器只需要.a文件。如果你發貨,任何人都可以在沒有源代碼的情況下使用你的軟件包。

但是您的用戶將不得不手動調用編譯器(例如6g,而不是go工具)。如果你推出一款myfoo.a文件只包含package myfoomyfoo.a時間戳比的myfoo.go新的虛擬源myfoo.go(你把一切都在的地方),你可以使用go工具。

更新:旅途工具的較新版本檢測刪除的文件,並需要與src文件夾中的文件名正確和更老的時間戳的所有文件(可能爲空)。 管理時間戳不應該是一個破壞者。

不要上當了go工具圍棋:它是構建,測試,得到的,無論你的Go代碼死方便的工具,但它既不是語言,也不是編譯器和鏈接器。

順便說一句:沒有分配來源沒有意義。

+0

謝謝Volker!現在在這裏瞭解問題。原因是我在'去建立'是大多數開發人員將反正使用這個工具爲他們的項目。 – 2015-02-11 09:04:31

+2

單挑:從Go 1.5開始,這個技巧不再適用,請參閱[此GitHub問題](https://github.com/golang/go/issues/12186)。 – tsuna 2015-08-19 04:41:34

5

的二進制包只是會在go1.7提供(2016八月) - https://tip.golang.org/doc/go1.7

此版本增加了以二進制形式發佈不實驗,最小的建設方案採用二進制只包的支持,包相應的源代碼。此功能在某些商業環境中是必需的,但不打算完全集成到工具鏈的其餘部分。例如,假定訪問完整源代碼的工具不能使用這些包,並且沒有計劃在「go get」命令中支持這些包。

該提案是在https://github.com/golang/proposal/blob/master/design/2775-binary-only-packages.md,https://tip.golang.org/pkg/go/build/#hdr-Binary_Only_Packages有關於新功能的更多信息。

2

現在僅支持二進制包。

您現在只能提供.a文件和沒有源代碼的假冒文件來分發它。

這裏是一個detailed example and a script of Go1.7 binary package generator.

myframework/frameImplement.go

package myframework 

import "fmt" 

func Hello(name string) string { 
    return fmt.Sprintf("Hello, %s!", name) 
} 

主/ main.go

package main 

import (
    "fmt" 
    "golang-binary-package-generator/myframework" 
) 

func main() { 
    fmt.Println(" start program ") 
    fmt.Println(" print program :", myframework.Hello("print something now")) 
} 

如果我想隱藏我的框架的源代碼,只需用它打造go build -i -o $GOPATH/pkg/framework.a,然後修改您的源代碼到

//go:binary-only-package 

package framework 

//you can add function prototype here for go doc etc, but no necessary. 

,您可以使用我的二進制包生成器(腳本)來幫助您。

+0

請在此處發佈示例答案,然後參考 – Sachith 2016-12-05 06:52:44

+0

@Sachith謝謝。 – 2016-12-05 07:08:23