Go 程式在 macOS 上的打包功能

來源:互聯網
上載者:User
這篇文章簡單地說明了如何在 macOS 上打包一個 Go 的程式,包括引用或者不引用外部資源。作為一個原生的 Cocoa 程式它是可以下載、安裝和啟動並執行。開發過程並不需要 XCode,cgo 或者其他特殊的庫檔案。在此文章結尾處,你的 Go 程式將會被打包進一個 `.app` 檔案,成為一個拖放安裝的唯讀 DMG 檔案。這也適用於其他非 Go 語言的程式。關於這個端到端的解決方案的主題還有其他很多的指導文章,有的講的比我想要做的內容多很多,有的又是採用不同的方式,而我想呈現給你的是如何將檔案打包的過程。**要求**:你必須要有一個 macOS。此方法不會在 Windows 或者 Linux 上生效。事實上,它也可能生效,但是你必須要手動或者藉助某些瘋狂的工具來製作和 macOS 相關的東西,比如 DMG 或者 `.DS_Store` 檔案。## 為你的 app 製作一個表徵圖你需要一個高解析度的表徵圖;最好漂亮點兒。需要在淺色背景和深色都表現優秀。[參見 Apple 的官方文檔](https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Optimizing/Optimizing.html)。為了最好的效果,將表徵圖儲存為 1024x1024 解析度的透明 PNG 檔案。如下為一些樣本:![avatar](https://raw.githubusercontent.com/studygolang/gctt-images/master/package-for-mac/1.png)### 編譯表徵圖集當準備好大表徵圖之後,你需要將它儲存成不同的尺寸和解析度。為了獲得更好的相容性,推薦的尺寸列表為:16,32,64,128,256,512 和 1024;每一個尺寸都需要為高解析度的情境(除了 1024)準備 `@2x` 的表徵圖。如果沒有一個圖形化的程式幫你做這件事情,將會非常乏味和冗長;或者你可以利用如下所示的命令 (sips) 來做解析度調整的工作:```shell$ sips -z $SIZE $SIZE myicon.png \ --out myicon_${SIZE}x${SIZE}.png```以此類推。不要忘了 `@2x` 的批次,它們的尺寸的層級更高,但是會標註為當前的名稱。這的確是很繁瑣的工作,但這是可以自動化的,而且你只需要做一次(本文末尾連結了一個樣本程式)。接著,假設你的表徵圖檔案位於一個叫做 myicons 的檔案夾呢,使用[iconutil](https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40012302-CH7-SW2)來產生表徵圖:```shell$ iconutil -c icns -o \ icon.icns myicons.iconset```### 製作.app bundlemacOS 上可裝載可啟動並執行的程式僅僅是一個 .app 的檔案夾,裡麵包含了一個二進位檔案和資訊清單檔。你甚至可以手動建立。它的目錄結構類似於:```shell$ tree Caddy.appCaddy.app/└── Contents ├── Info.plist ├── MacOS │ └── caddy └── Resources └── icon.icns3 directories, 3 files```關鍵檔案包含:+ Info.plist: 資訊清單檔。可以從其他地方拷貝過來進行定製化+ caddy: 你要打包的二進位檔案+ icon.icns: 打包好的不同尺寸的表徵圖檔案(右鍵或者按住 Ctrl 鍵單擊程式表徵圖,選擇"顯示包內容"可以瀏覽 .app 的檔案夾)### 添加 Info.plist 檔案這裡展示了一個資訊清單檔,你可以根據自己的內容進行修改([來自 Dmitri Shurylov](https://github.com/shurcooL/trayhost),感謝原作者)```xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>CFBundleExecutable</key> <string>caddy</string> <key>CFBundleIconFile</key> <string>icon.icns</string> <key>CFBundleIdentifier</key> <string>com.example.yours</string> <key>NSHighResolutionCapable</key> <true/> <key>LSUIElement</key> <true/></dict></plist>```請確保替換了 [CFBundleExecutable](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html) 和 [CFBundleIdentifier](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html)。注意:[LSUIElement](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html) 告訴作業系統你的程式是一個代理程式,所以他不會出現在工作列。這非常重要,否則它將一直反覆出現在工作列中,除非你的 Go 程式設計成像 Cocoa 程式一樣響應 Mac 事件迴圈中的事件。恭喜你!你的 Go 程式已經有了一個打好包 `.app`。雙擊表徵圖後它將會運行。你可以將它拖到應用程式檔案夾,它會像一個 Cocoa 程式一樣出現在你的啟動器中。## 製作 DMG 檔案DMG 檔案是你分發程式的檔案。它壓縮了整個 `.app` 檔案,可以很輕易的拖到應用程式檔案夾並且安裝。此教程展示了手動的製作過程,後面的要點是告訴你如何自動化的做這件事情。### 製作 DMB 模板模板只需要製作一次。開啟磁碟工具。按 ⌘N 建立一個新的磁碟鏡像。給它取個名字,配置好足以容納你的程式包的空間大小。![avatar](https://raw.githubusercontent.com/studygolang/gctt-images/master/package-for-mac/2.png)在 Finder 中找到掛載的鏡像。定製化此檔案夾的視圖設定,使得它成為你想要使用者實際安裝時看到的樣子。可以考慮設定一個背景圖,隱藏工具列和側邊欄,增加表徵圖尺寸等。注意:背景圖必須包含在 DMG 中。通常會放在 `.background` 檔案夾中。檔案夾名字以點號開頭,它會顯示為隱藏檔案夾。把背景圖片放在這裡,並拖放到視圖選項中進行配置。![avatar](https://raw.githubusercontent.com/studygolang/gctt-images/master/package-for-mac/3.png)為了方便起見,你可能需要為 DMG 的 /Application 檔案夾建立一個捷徑(別名)。你可以右鍵點擊 /Application 檔案夾,選擇“建立別名”,並移動到掛載好的鏡像中。![avatar](https://raw.githubusercontent.com/studygolang/gctt-images/master/package-for-mac/4.png)現在我們可以把打包好的 app 加入到 DMG 中來完成視圖的定製化:![avatar](https://raw.githubusercontent.com/studygolang/gctt-images/master/package-for-mac/5.png)幹得好!我們的模板 DMG 已經全部建好了。現在它已經可以用於分發了。## 轉換 DMG 檔案以便於分發當前的 DMG 沒有經過壓縮並且是可寫的。這對於發布程式是不夠的,所以我們必須做一下轉換來修複。開啟磁碟工具,選擇鏡像->轉換。給檔案起一個有意義的名稱,其他設定保持不變。(鏡像格式應為“壓縮”)![avatar](https://raw.githubusercontent.com/studygolang/gctt-images/master/package-for-mac/6.png)瞧!你現在擁有了一個發行就緒的壓縮包。當你開啟這個檔案,把它拖動到應用程式建立捷徑後,它會出現在啟動器中:![avatar](https://raw.githubusercontent.com/studygolang/gctt-images/master/package-for-mac/7.png)“哦,很漂亮!”...除了有點兒單調。:)## 未來的鏡像製作以後,你可以重用這個模板 DMG 和表徵圖。所有痛苦的工作只需要做一次。為了再次發布,你只需要重新打包 .app (可以自動化),替換到模板 DMG 裡(可以自動化)和重新轉換 DMG 來分發(同樣可以自動化)。## 將過程自動化上面介紹的一些一次性的工作可以自動化(比如建立表徵圖庫)。但是有些很難用自動化取得很好的結果(比如定製化 DMG 的視圖)。幸運的是,除此之外的部分是很容易做到自動化的,包括每次重新打包一個新的發布版本所需要的步驟。hdiutil 這個命令可以協助你來建立、掛在和轉換鏡像。[這裡](https://gist.github.com/mholt/11008646c95d787c30806d3f24b2c844)是我寫的自動化的樣本。它會建立一個打包的 .app,如果你給它模板 .dmg 它可以建立最終的 .dmg。它甚至封裝了上文所述的建立表徵圖的命令,可以幫你建立全部的不同尺寸的表徵圖。它做了所有的拷貝、掛載、卸載和鏡像轉換。你可以對你不喜歡的部分或者它不能工作的地方(非常有可能發生,哈哈)做改動。它有很好的注釋,很容易閱讀。你只需要告訴它二進位檔案在哪裡、資源檔在哪裡、二進位檔案的名字、1024像素的表徵圖檔案和有意義的程式名字。這不是一個會繼續維護的開源項目。如果要使用它,你可以將它整合進實際的應用情境中。我認為讓更多的 Go 項目以 app 的形式運行是非常酷的事情。Go 代碼非常美麗,為什麼不能讓編譯出來的二進位檔案也同樣美麗呢?

via: https://medium.com/@mattholt/packaging-a-go-application-for-macos-f7084b00f6b5

作者:Matt Holt 譯者:lebai03 校對:polaris1119

本文由 GCTT 原創編譯,Go語言中文網 榮譽推出

本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽

151 次點擊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.