# 第4章.發行應用
---
要使用 Electron 發布你的應用,包含你應用的文件夾名必須為 `app`,并放在 Electron 的 `resources` 目錄下(在 macOS 中,是 `Electron.app/Contents/Resources/`;在 Linux 和 Windows 中,為 `resources/`),就像這樣:
**macOS:**
~~~
electron/Electron.app/Contents/Resources/app/
├── package.json
├── main.js
└── index.html
~~~
**Windows 和 Linux**
~~~
electron/resources/app
├── package.json
├── main.js
└── index.html
~~~
然后執行 `Electron.app`(或者Linux上的 `electron`;Window上的 `electron.exe`),Electron 就會啟動為你的 app。`electron` 目錄就是就是你交付給最終用戶的發行版。
## 打包應用為一個文件
除了拷貝所有應用的資源文件來分發你的 app,還可以打包為一個 [asar](https://github.com/electron/asar) 檔案,以避免暴露你應用源代碼給用戶。
要使用一個 `asar` 檔案來替代 `app` 文件夾,需要重命名檔案為 `app.asar`,并像下面那樣放到 Electron 的 `resources` 目錄,然后 Electron 會嘗試讀取檔案,并從其中啟動。
**macOS**
~~~
electron/Electron.app/Contents/Resources/
└── app.asar
~~~
**Windows 和 Linux**
~~~
electron/resources/
└── app.asar
~~~
更多信息可以在【[應用打包](227458)】中查閱。
## 使用下載的二進制再造
當打包你的應用到 Electron 之后,你會希望在分發給用戶之前再造 Electron 。
**Windows**
你可以重命名 `electron.exe` 文件為任何你喜歡的名字,并使用如 [rcedit](https://github.com/atom/rcedit) 等工具修改 icon 和其它信息。
**macOS**
可以重命名 `electron.app` 為任何你喜歡的名字,還需要重命名如下文件中的 `CFBundleDisplayName`、`CFBundleIdentifier` 和 `CFBundleName` 字段:
* Electron.app/Contents/Info.plist
* Electron.app/Contents/Frameworks/Electron Helper.app/Contents/Info.plist
還可以重命名 `helper app` 來避免 Activity Monitor 中顯示 `Electron Helper`。但是,確保你已經重命名了 `helper app` 的可執行文件的名稱。
重命名后的 app 的結構應該如下:
~~~
MyApp.app/Contents
├── Info.plist
├── MacOS/
│ └── MyApp
└── Frameworks/
├── MyApp Helper EH.app
| ├── Info.plist
| └── MacOS/
| └── MyApp Helper EH
├── MyApp Helper NP.app
| ├── Info.plist
| └── MacOS/
| └── MyApp Helper NP
└── MyApp Helper.app
├── Info.plist
└── MacOS/
└── MyApp Helper
~~~
**Linux**
可以重命名 `electron` 可執行程序為任何你喜歡的名字。
## 打包工具
除了手動打包你的app,還可以選擇使用第三方打包工具來替你完成這個工作:
* [electron-builder](https://github.com/electron-userland/electron-builder)
* [electron-packager](https://github.com/electron-userland/electron-packager)
## 通過從源代碼重建 Electron 來再造
還可以通過從源碼重建來改變產品名字,以再造 Electron。要這樣做,你需要修改 `atom.gyp` 文件,并且進行一個干凈的重建。
**grunt-build-atom-shell**
手動檢出 Electron 的代碼并重建非常復雜,所以一個可以自動處理這個過程的 Grunt 任務被創建:[grunt-build-atom-shell](https://github.com/paulcbetts/grunt-build-atom-shell)。
這個任務會自動處理編輯 `.gyp` 文件,自動從源碼重建,然后重建你的應用中的原生 Node 模塊來匹配新的可執行文件名稱。
**創建一個自定義 Electron 分支**
如果只是為了構建你的 app,甚至對于產品級的應用,你幾乎都不用去創建一個 Electron 的自定義分支。使用一個如 `electron-packager` 或者 `electron-builder` 的工具,就可以再造 Electron,而不需要這些步驟。
當你有自定義的直接打補丁到 Electron 的、或者不能被逆流的、或者被從官方版本拒絕的 C++ 代碼,才需要分支 Electron。作為 Electron 的維護者,我們非常愿意讓你的工作場景運行,所以盡可能努力將你的修改提交到官方 Electron 版本,這對你來說是非常容易的,我們也會感激你的幫助。
**使用 surf-build 來創建一個自定義的發布:**
1. 安裝 [surf](https://github.com/surf-build/surf),通過 npm:`npm install -g surf-build@latest`
2. 創建一個新的 S3 bucket,并創建如下空目錄結構:
~~~
- atom-shell/
- symbols/
- dist/
~~~
設置如下環境變量:
* `ELECTRON_GITHUB_TOKEN` —— 一個可以在 GitHub 創建發布的令牌
* `ELECTRON_S3_ACCESS_KEY`, `ELECTRON_S3_BUCKET`, `ELECTRON_S3_SECRET_KEY` —— 你將上傳 node.js headers 以及 symbols 的位置
* `ELECTRON_RELEASE` —— 設置為 `true` 然后上傳部分將會運行, leave unset and surf-build will just do CI-type checks, appropriate to run for every pull request
* `CI` —— 設置為 `true` 否則它會失敗
* `GITHUB_TOKEN` —— 設置它跟 `ELECTRON_GITHUB_TOKEN` 一樣
* `SURF_TEMP` —— 在 Windows 上設置為 C:\Temp 來阻止過長路徑的問題
* `TARGET_ARCH` —— 設置為 `ia32` 或 `x64`
1. 在 `script/upload.py` 中,必須設置 `ELECTRON_REPO` 到你的分支(MYORG/electron),特別是如果你本身就是 Electron 的貢獻者時
2. `surf-build -r https://github.com/MYORG/electron -s YOUR_COMMIT -n 'surf-PLATFORM-ARCH'`
3. 等待漫長的時間之后,構建完成
- 索引
- 前言.關于Electron
- 第一部分 開發指南
- 第1章.平臺支持
- 第2章.安全、原生功能和你的責任
- 第3章.版本說明
- 第4章.發行應用
- 第5章.Mac App商店提交指南
- 第6章.Windows商店指南
- 第7章.應用打包
- 第8章.使用Node原生模塊
- 第9章.調試主進程
- 9.1.在VSCode中調試
- 9.2.在node-inspector中調試
- 第10章.使用Selenium和WebDriver
- 第11章.DevTools擴展
- 第12章.使用Pepper Flash插件
- 第13章.使用Widevine CDM插件
- 第14章.通過自動化持續集成系統進行測試
- 第15章.離屏渲染
- 第二部分 使用教程
- 第16章.快速入門
- 第17章.桌面環境集成
- 第18章.在線/離線事件探測
- 第19章.應答式編譯器(REPL)
- 第三部分 API參考
- 第20章.API簡介
- 第21章.進程對象
- 第22章.Chrome的命令行開關
- 第23章.環境變量
- 第24章.定制的DOM元素
- 24.1.File 對象
- 24.2.webview 標簽
- 第25章.主進程模塊
- 25.1.app
- 25.2.BrowserWindow
- 25.3.無框架窗口
- 第26章.渲染進程模塊
- 第27章.兩種進程可用的模塊
- 第四部分 高級主題
- 附 FAQ
- 附 文檔規范
- 附 示例用例
- 1.無邊框窗口