2014-02-26 73 views
2

我有一個去應用程序,它非常依賴靜態資源,如圖像和罐子。我想安裝可執行文件在不同的平臺,如Linux,Mac和Windows。分發可執行的有效方式

  • 我使用https://github.com/jteeuwen/go-bindata捆綁的資源的第一個念頭,但是由於文件(〜100)有大小大約20MB的左右,它需要一個很長的時間來建立可執行文件。我認爲有一個單一的可執行文件是人們下載可執行文件並運行它的簡單方法。但似乎這不是一個有效的方法。

  • 然後我想爲每個平臺編寫一個安裝包,比如創建一個.rpm或.deb包?因此,這些軟件包包含所有資源並將其放入特定平臺的預定義位置,並且go可執行文件可以引用它們。但唯一的是我必須在轉碼中處理這個問題。我必須看看它是否是windows,然後從c:\ go-installs加載文件,或者如果是linux,則從/ usr/local/share/go-installs加載文件。我希望代碼能夠像平臺一樣不可知。

或者還有其他一些策略嗎?

謝謝

回答

1

可能沒有資格作爲真正的答案,但仍然......「

  • 至於你點№2,來處理這一種方法是利用Go's way to do conditional compilation:您可以創建一組文件像res_linux.gores_windows.go等,並提出了一套在每個相同的變量,指向不同位置,像

    var InstallsPath = `C:\go-installs` 
    
    res_windows.go

    var InstallsPath = `/usr/share/myapp` 
    

    res_linux.go等。然後在程序的其餘部分只需引用res.InstallsPath變量並使用path/filepath包構建實際資源的完整路徑名。

    當然,另一種方法是在runtime.GOOS變量—上執行運行時切換,可能在init()函數中的一個源文件中。

  • 將所有內容打包在zip存檔中,並使用archive/zip從中讀取資源文件。這樣,你將不得不分發兩個文件— 差不多「xcopy部署」。

    請注意,在Windows中,您可以讓您的可執行文件從其自身的路徑名(os.Args[0])中提取目錄,並假定資源文件位於POSIX平臺上的同一目錄中(GNU/Linux和* BSD等)資源文件仍應位於/usr/share/myappFHS(或particular distro's rules)指定的類似位置下,因此仍需要一些用於查找該文件的邏輯。

總而言之,如果這應該是一件FOSS,我會用第一方案去讓下游打包調整的路徑名。如果這是一個專有軟件(或者僅僅是小衆軟件),那麼第二個想法似乎是相當不錯的,因爲你將自己扮演下游打包商的角色。