<!DOCTYPE html><html><head><title>Hello World!</title></head><body><h1>Hello World!</h1> We are using io.js <script>document.write(process.version)</script> and Electron <script>document.write(process.versions['electron'])</script>. </body></html>
Applications define tasks based on both the program's features and the key things a user is expected to do with them. Tasks should be context-free, in that the application does not need to be running for them to work. They should also be the statistically most common actions that a normal user would perform in an application, such as compose an email message or open the calendar in a mail program, create a new document in a word processor, launch an application in a certain mode, or launch one of its subcommands. An application should not clutter the menu with advanced features that standard users won't need or one-time actions such as registration. Do not use tasks for promotional items such as upgrades or special offers.
It is strongly recommended that the task list be static. It should remain the same regardless of the state or status of the application. While it is possible to vary the list dynamically, you should consider that this could confuse the user who does not expect that portion of the destination list to change.
IE 的任务
不同于 OS X 的鱼眼菜单,Windows 上的用户任务表现得更像一个快捷方式,比如当用户点击一个任务,一个程序将会被传入特定的参数并且运行。
This toolbar is simply the familiar standard toolbar common control. It has a maximum of seven buttons. Each button's ID, image, tooltip, and state are defined in a structure, which is then passed to the taskbar. The application can show, enable, disable, or hide buttons from the thumbnail toolbar as required by its current state.
For example, Windows Media Player might offer standard media transport controls such as play, pause, mute, and stop.
获得证书之后,你可以使用 Application Distribution 打包你的应用, 然后前往提交你的应用.这个步骤基本上和其他程序一样,但是这 key 一个个的标识 Electron 的每个依赖.
首先,你需要准备2个授权文件 .
child.plist:
<?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"><plistversion="1.0"><dict><key>com.apple.security.app-sandbox</key><true/><key>com.apple.security.inherit</key><true/></dict></plist>
parent.plist:
<?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"><plistversion="1.0"><dict><key>com.apple.security.app-sandbox</key><true/></dict></plist>
然后使用下面的脚本标识你的应用 :
#!/bin/bash# Name of your app.APP="YourApp"# The path of you app to sign.APP_PATH="/path/to/YouApp.app"# The path to the location you want to put the signed package.RESULT_PATH="~/Desktop/$APP.pkg"# The name of certificates you requested.APP_KEY="3rd Party Mac Developer Application: Company Name (APPIDENTITY)"INSTALLER_KEY="3rd Party Mac Developer Installer: Company Name (APPIDENTITY)"FRAMEWORKS_PATH="$APP_PATH/Contents/Frameworks"codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A"codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper.app/"codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper EH.app/"codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper NP.app/"if [ -d"$FRAMEWORKS_PATH/Squirrel.framework/Versions/A" ]; then# Signing a non-MAS build. codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/Mantle.framework/Versions/A" codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/ReactiveCocoa.framework/Versions/A" codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/Squirrel.framework/Versions/A"ficodesign -fs "$APP_KEY" --entitlements parent.plist "$APP_PATH"productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY""$RESULT_PATH"
如果你是 OS X 下的应用沙箱使用新手,应当仔细阅读 Apple 的 Enabling App Sandbox 来有一点基础,然后向授权文件添加你的应用需要的许可 keys .
APP_DATA 是系统存放数据的地方,在 Windows 上它是%LOCALAPPDATA%, 在 OS X 上它是 ~/Library/Application Support. VERSION 是Widevine CDM 插件的版本字符串, 类似 1.4.8.866. PLATFORM 是 mac 或win. ARCH 是 x86 或 x64.
在 Windows,必要的二进制文件是 widevinecdm.dll andwidevinecdmadapter.dll, 在 OS X ,它们是 libwidevinecdm.dylib 和widevinecdmadapter.plugin. 你可以将它们复制到任何你喜欢的地方,但是它们必须要放在一起.
Linux
在 Linux ,Chrome 浏览器将插件的二进制文件装载在一起 , 你可以在 /opt/google/chrome 下找到,文件名是 libwidevinecdm.so 和libwidevinecdmadapter.so.
使用插件
在获得了插件文件后,你可以使用 --widevine-cdm-path 命令行开关来将 widevinecdmadapter 的路径传递给 Electron , 插件版本使用 --widevine-cdm-version 开关.
// You have to pass the filename of `widevinecdmadapter` here, it is// * `widevinecdmadapter.plugin` on OS X,// * `libwidevinecdmadapter.so` on Linux,// * `widevinecdmadapter.dll` on Windows.app.commandLine.appendSwitch('widevine-cdm-path', '/path/to/widevinecdmadapter.plugin');// The version of plugin can be got from `chrome://plugins` page in Chrome.app.commandLine.appendSwitch('widevine-cdm-version', '1.4.8.866');var mainWindow = null;app.on('ready', function() { mainWindow = new BrowserWindow({ webPreferences: { // The `plugins` have to be enabled. plugins: true } })});
就像 Node ,Electron 致力于使用一些少量的设置和 API 来提供所有的必须的支持给开发中的跨平台应用。这个设计理念让 Electron 能够保持灵活而不被过多的规定有关于如何应该被使用。Userland 让用户能够创造和分享一些工具来提额外的功能在这个能够使用的 "core(核心)"之上。
V8
V8 是谷歌公司的开源的 JavaScript 引擎。它使用 C++ 编写并使用在谷歌公司开源的的浏览器 Google Chrome 上。V8 能够单独运行或者集成在任何一个 C++ 应用内。
webview
webview 标签用于集成 'guest(访客)' 内容(比如外部的网页)在你的 Electron 应用内。它们类似于 iframe,但是不同的是每个 webview 运行在独立的进程中。 作为页面它拥有不一样的权限并且所有的嵌入的内容和你应用之间的交互都将是异步的。这将保证你的应用对于嵌入的内容的安全性。
var app = require('app');app.on('window-all-closed', function() { app.quit();});
事件列表
app 对象会触发以下的事件:
事件:'will-finish-launching'
当应用程序完成基础的启动的时候被触发。在 Windows 和 Linux 中,will-finish-launching事件与ready事件是相同的; 在 OS X 中, 这个时间相当于NSApplication中的applicationWillFinishLaunching提示。 你应该经常在这里为open-file和open-url设置监听器,并启动崩溃报告和自动更新。
当用户想要在应用中打开一个文件时触发。open-file事件常常在应用已经打开并且系统想要再次使用应用打开文件时被触发。open-file也会在一个文件被拖入 dock 且应用还没有运行的时候被触发。 请确认在应用启动的时候(甚至在ready事件被触发前)就对open-file事件进行监听,以处理这种情况。
在 Windows 上,你必须使用安装程序将你的应用装到用户的计算机上,所以比较推荐的方法是用grunt-electron-installer这个模块来自动生成一个 Windows 安装向导。
Squirrel 自动生成的安装向导会生成一个带Application User Model ID的快捷方式。Application User Model ID 的格式是com.squirrel.PACKAGE_ID.YOUR_EXE_WITHOUT_DOT_EXE, 比如像com.squirrel.slack.Slack和com.squirrel.code.Code这样的。你应该在自己的应用中使用app.setAppUserModelId方法设置相同的 API,不然 Windows 将不能正确地把你的应用固定在任务栏上。
// In the main process.const BrowserWindow = require('electron').BrowserWindow;// Or in the renderer process.const BrowserWindow = require('electron').remote.BrowserWindow;var win = new BrowserWindow({ width: 800, height: 600, show: false });win.on('closed', function() { win = null;});win.loadURL('https://github.com');win.show();
var win = ...; // BrowserWindow in which to show the dialogconst dialog = require('electron').dialog;console.log(dialog.showOpenDialog({ properties: [ 'openFile', 'openDirectory', 'multiSelections' ]}));
OS X 上的注意事项: 如果你想像sheets一样展示对话框,只需要在browserWindow参数中提供一个BrowserWindow的引用对象.
protocol.registerBufferProtocol('atom', function(request, callback) { callback({mimeType: 'text/html', data: new Buffer('<h5>Response</h5>')});}, function (error) { if (error) console.error('Failed to register protocol')});
Electron 确保在渲染进程中的远程对象存在(换句话说,没有被垃圾收集),那主进程中的对应对象也不会被释放。 当远程对象被垃圾收集之后,主进程中的对应对象才会被取消关联。
如果远程对象在渲染进程泄露了(即,存在某个表中但永远不会释放),那么主进程中的对应对象也一样会泄露, 所以你必须小心不要泄露了远程对象。If the remote object is leaked in the renderer process (e.g. stored in a map but never freed), the corresponding object in the main process will also be leaked, so you should be very careful not to leak remote objects.
不过,主要的值类型如字符串和数字,是传递的副本。
给主进程传递回调函数
在主进程中的代码可以从渲染进程——remote模块——中接受回调函数,但是使用这个功能的时候必须非常非常小心。Code in the main process can accept callbacks from the renderer - for instance theremotemodule - but you should be extremely careful when using this feature.
首先,为了避免死锁,传递给主进程的回调函数会进行异步调用。所以不能期望主进程来获得传递过去的回调函数的返回值。First, in order to avoid deadlocks, the callbacks passed to the main process are called asynchronously. You should not expect the main process to get the return value of the passed callbacks.
默认,libchromiumcontent是从 Amazon Web Services 上下载下来的.如果设置了LIBCHROMIUMCONTENT_MIRROR环境变量,bootstrap脚本会从这里下载下来.libchromiumcontent-qiniu-mirror是libchromiumcontent的映射.如果你不能连接 AWS,你可以切换下载路径:export LIBCHROMIUMCONTENT_MIRROR=http://7xk3d2.dl1.z0.glb.clouddn.com/如果只是想快速搭建一个 Electron 的测试或开发环境,可以通过--dev参数只下载共享版本库:
$ ./script/bootstrap.py --dev$ ./script/build.py -c D
如果你遇到了一个错误,类似Command xxxx not found, 可以尝试使用VS2012 Command Prompt控制台来执行构建脚本 .
Fatal internal compiler error: C1001
确保你已经安装了 Visual Studio 的最新安装包 .
Assertion failed: ((handle))->activecnt >= 0
如果在 Cygwin 下构建的,你可能会看到bootstrap.py失败并且附带下面错误 :
Assertion failed: ((handle))->activecnt >= 0, file srcwinpipe.c, line 1430Traceback (most recent call last): File "script/bootstrap.py", line 87, in <module> sys.exit(main()) File "script/bootstrap.py", line 22, in main update_node_modules('.') File "script/bootstrap.py", line 56, in update_node_modules execute([NPM, 'install']) File "/home/zcbenz/codes/raven/script/lib/util.py", line 118, in execute raise esubprocess.CalledProcessError: Command '['npm.cmd', 'install']' returned non-zero exit status 3
调试 symbols 让你有更好的调试 sessions. 它们有可执行的动态库的函数信息,并且提供信息来获得洁净的呼叫栈. 一个 Symbol 服务器允许调试器自动加载正确的 symbols, 二进制文件 和 资源文件,不用再去强制用户下载巨大的调试文件. 服务器函数类似Microsoft's symbol server,所以这里的记录可用.
注意,因为公众版本的 Electron 构建是最优化的,调试不一定一直简单.调试器将不会给显示出所有变量内容,并且因为内联,尾调用,和其它编译器优化,执行路径会看起来很怪异 . 唯一的解决办法是搭建一个不优化的本地构建.
Electron 使用的官方 symbol 服务器地址为http://54.249.141.255:8086/atom-shell/symbols. 你不能直接访问这个路径,必须将其添加到你的调试工具的 symbol 路径上.在下面的例子中,使用了一个本地缓存目录来避免重复从服务器获取 PDB. 在你的电脑上使用一个恰当的缓存目录来代替c:codesymbols.
Using the Symbol Server in Windbg
Windbg symbol 路径被配制为一个限制带星号字符的字符串. 要只使用 Electron 的 symbol 服务器, 将下列记录添加到你的 symbol 路径 (注意:如果你愿意使用一个不同的地点来下载 symbols,你可以在你的电脑中使用任何可写的目录来代替c:codesymbols):
Microsoft 开发了一个工具,将 Electron 应用程序编译为 .appx 软件包,使开发人员能够使用新应用程序模型中的一些好东西。 本指南解释了如何使用它 - 以及 Electron AppX 包的功能和限制。
背景和要求
Windows 10 的 "周年更新" 能够运行 win32 .exe 程序并且它们的虚拟化文件系统和注册表跟随一起启动。 两者都是通过在 Windows 容器中运行应用程序和安装器编译后创建的,允许 Windows 在安装过程中正确识别操作系统进行了哪些修改。 将可执行文件和虚拟文件系统与虚拟注册表配对, 允许 Windows 启用一键安装和卸载。
您可以将 Electron 应用程序与不可见的 UWP 后台任务配对,以充分利用 Windows 10 功能,如推送通知,Cortana 集成或活动磁贴。
如何使用 Electron 应用程序通过后台任务发送 Toast 通知和活动磁贴,请查看微软提供的案例.
可选: 使用容器虚拟化进行转换
要生成 AppX 包,electron-windows-store CLI 使用的模板应该适用于大多数 Electron 应用程序。 但是,如果您使用自定义安装程序,或者您遇到生成的包的任何问题,您可以尝试使用 Windows 容器编译创建包 - 在该模式下,CLI 将在空 Windows 容器中安装和运行应用程序,以确定应用程序正在对操作系统进行哪些修改。
<!DOCTYPE html><html><head><title>Hello World!</title></head><body><h1>Hello World!</h1> We are using io.js <script>document.write(process.version)</script> and Electron <script>document.write(process.versions['electron'])</script>. </body></html>
Applications define tasks based on both the program's features and the key things a user is expected to do with them. Tasks should be context-free, in that the application does not need to be running for them to work. They should also be the statistically most common actions that a normal user would perform in an application, such as compose an email message or open the calendar in a mail program, create a new document in a word processor, launch an application in a certain mode, or launch one of its subcommands. An application should not clutter the menu with advanced features that standard users won't need or one-time actions such as registration. Do not use tasks for promotional items such as upgrades or special offers.
It is strongly recommended that the task list be static. It should remain the same regardless of the state or status of the application. While it is possible to vary the list dynamically, you should consider that this could confuse the user who does not expect that portion of the destination list to change.
IE 的任务
不同于 OS X 的鱼眼菜单,Windows 上的用户任务表现得更像一个快捷方式,比如当用户点击一个任务,一个程序将会被传入特定的参数并且运行。
This toolbar is simply the familiar standard toolbar common control. It has a maximum of seven buttons. Each button's ID, image, tooltip, and state are defined in a structure, which is then passed to the taskbar. The application can show, enable, disable, or hide buttons from the thumbnail toolbar as required by its current state.
For example, Windows Media Player might offer standard media transport controls such as play, pause, mute, and stop.
获得证书之后,你可以使用 Application Distribution 打包你的应用, 然后前往提交你的应用.这个步骤基本上和其他程序一样,但是这 key 一个个的标识 Electron 的每个依赖.
首先,你需要准备2个授权文件 .
child.plist:
<?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"><plistversion="1.0"><dict><key>com.apple.security.app-sandbox</key><true/><key>com.apple.security.inherit</key><true/></dict></plist>
parent.plist:
<?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"><plistversion="1.0"><dict><key>com.apple.security.app-sandbox</key><true/></dict></plist>
然后使用下面的脚本标识你的应用 :
#!/bin/bash# Name of your app.APP="YourApp"# The path of you app to sign.APP_PATH="/path/to/YouApp.app"# The path to the location you want to put the signed package.RESULT_PATH="~/Desktop/$APP.pkg"# The name of certificates you requested.APP_KEY="3rd Party Mac Developer Application: Company Name (APPIDENTITY)"INSTALLER_KEY="3rd Party Mac Developer Installer: Company Name (APPIDENTITY)"FRAMEWORKS_PATH="$APP_PATH/Contents/Frameworks"codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A"codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper.app/"codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper EH.app/"codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper NP.app/"if [ -d"$FRAMEWORKS_PATH/Squirrel.framework/Versions/A" ]; then# Signing a non-MAS build. codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/Mantle.framework/Versions/A" codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/ReactiveCocoa.framework/Versions/A" codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/Squirrel.framework/Versions/A"ficodesign -fs "$APP_KEY" --entitlements parent.plist "$APP_PATH"productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY""$RESULT_PATH"
如果你是 OS X 下的应用沙箱使用新手,应当仔细阅读 Apple 的 Enabling App Sandbox 来有一点基础,然后向授权文件添加你的应用需要的许可 keys .
APP_DATA 是系统存放数据的地方,在 Windows 上它是%LOCALAPPDATA%, 在 OS X 上它是 ~/Library/Application Support. VERSION 是Widevine CDM 插件的版本字符串, 类似 1.4.8.866. PLATFORM 是 mac 或win. ARCH 是 x86 或 x64.
在 Windows,必要的二进制文件是 widevinecdm.dll andwidevinecdmadapter.dll, 在 OS X ,它们是 libwidevinecdm.dylib 和widevinecdmadapter.plugin. 你可以将它们复制到任何你喜欢的地方,但是它们必须要放在一起.
Linux
在 Linux ,Chrome 浏览器将插件的二进制文件装载在一起 , 你可以在 /opt/google/chrome 下找到,文件名是 libwidevinecdm.so 和libwidevinecdmadapter.so.
使用插件
在获得了插件文件后,你可以使用 --widevine-cdm-path 命令行开关来将 widevinecdmadapter 的路径传递给 Electron , 插件版本使用 --widevine-cdm-version 开关.
// You have to pass the filename of `widevinecdmadapter` here, it is// * `widevinecdmadapter.plugin` on OS X,// * `libwidevinecdmadapter.so` on Linux,// * `widevinecdmadapter.dll` on Windows.app.commandLine.appendSwitch('widevine-cdm-path', '/path/to/widevinecdmadapter.plugin');// The version of plugin can be got from `chrome://plugins` page in Chrome.app.commandLine.appendSwitch('widevine-cdm-version', '1.4.8.866');var mainWindow = null;app.on('ready', function() { mainWindow = new BrowserWindow({ webPreferences: { // The `plugins` have to be enabled. plugins: true } })});
就像 Node ,Electron 致力于使用一些少量的设置和 API 来提供所有的必须的支持给开发中的跨平台应用。这个设计理念让 Electron 能够保持灵活而不被过多的规定有关于如何应该被使用。Userland 让用户能够创造和分享一些工具来提额外的功能在这个能够使用的 "core(核心)"之上。
V8
V8 是谷歌公司的开源的 JavaScript 引擎。它使用 C++ 编写并使用在谷歌公司开源的的浏览器 Google Chrome 上。V8 能够单独运行或者集成在任何一个 C++ 应用内。
webview
webview 标签用于集成 'guest(访客)' 内容(比如外部的网页)在你的 Electron 应用内。它们类似于 iframe,但是不同的是每个 webview 运行在独立的进程中。 作为页面它拥有不一样的权限并且所有的嵌入的内容和你应用之间的交互都将是异步的。这将保证你的应用对于嵌入的内容的安全性。
var app = require('app');app.on('window-all-closed', function() { app.quit();});
事件列表
app 对象会触发以下的事件:
事件:'will-finish-launching'
当应用程序完成基础的启动的时候被触发。在 Windows 和 Linux 中,will-finish-launching事件与ready事件是相同的; 在 OS X 中, 这个时间相当于NSApplication中的applicationWillFinishLaunching提示。 你应该经常在这里为open-file和open-url设置监听器,并启动崩溃报告和自动更新。
当用户想要在应用中打开一个文件时触发。open-file事件常常在应用已经打开并且系统想要再次使用应用打开文件时被触发。open-file也会在一个文件被拖入 dock 且应用还没有运行的时候被触发。 请确认在应用启动的时候(甚至在ready事件被触发前)就对open-file事件进行监听,以处理这种情况。
在 Windows 上,你必须使用安装程序将你的应用装到用户的计算机上,所以比较推荐的方法是用grunt-electron-installer这个模块来自动生成一个 Windows 安装向导。
Squirrel 自动生成的安装向导会生成一个带Application User Model ID的快捷方式。Application User Model ID 的格式是com.squirrel.PACKAGE_ID.YOUR_EXE_WITHOUT_DOT_EXE, 比如像com.squirrel.slack.Slack和com.squirrel.code.Code这样的。你应该在自己的应用中使用app.setAppUserModelId方法设置相同的 API,不然 Windows 将不能正确地把你的应用固定在任务栏上。
// In the main process.const BrowserWindow = require('electron').BrowserWindow;// Or in the renderer process.const BrowserWindow = require('electron').remote.BrowserWindow;var win = new BrowserWindow({ width: 800, height: 600, show: false });win.on('closed', function() { win = null;});win.loadURL('https://github.com');win.show();
var win = ...; // BrowserWindow in which to show the dialogconst dialog = require('electron').dialog;console.log(dialog.showOpenDialog({ properties: [ 'openFile', 'openDirectory', 'multiSelections' ]}));
OS X 上的注意事项: 如果你想像sheets一样展示对话框,只需要在browserWindow参数中提供一个BrowserWindow的引用对象.
protocol.registerBufferProtocol('atom', function(request, callback) { callback({mimeType: 'text/html', data: new Buffer('<h5>Response</h5>')});}, function (error) { if (error) console.error('Failed to register protocol')});
Electron 确保在渲染进程中的远程对象存在(换句话说,没有被垃圾收集),那主进程中的对应对象也不会被释放。 当远程对象被垃圾收集之后,主进程中的对应对象才会被取消关联。
如果远程对象在渲染进程泄露了(即,存在某个表中但永远不会释放),那么主进程中的对应对象也一样会泄露, 所以你必须小心不要泄露了远程对象。If the remote object is leaked in the renderer process (e.g. stored in a map but never freed), the corresponding object in the main process will also be leaked, so you should be very careful not to leak remote objects.
不过,主要的值类型如字符串和数字,是传递的副本。
给主进程传递回调函数
在主进程中的代码可以从渲染进程——remote模块——中接受回调函数,但是使用这个功能的时候必须非常非常小心。Code in the main process can accept callbacks from the renderer - for instance theremotemodule - but you should be extremely careful when using this feature.
首先,为了避免死锁,传递给主进程的回调函数会进行异步调用。所以不能期望主进程来获得传递过去的回调函数的返回值。First, in order to avoid deadlocks, the callbacks passed to the main process are called asynchronously. You should not expect the main process to get the return value of the passed callbacks.
默认,libchromiumcontent是从 Amazon Web Services 上下载下来的.如果设置了LIBCHROMIUMCONTENT_MIRROR环境变量,bootstrap脚本会从这里下载下来.libchromiumcontent-qiniu-mirror是libchromiumcontent的映射.如果你不能连接 AWS,你可以切换下载路径:export LIBCHROMIUMCONTENT_MIRROR=http://7xk3d2.dl1.z0.glb.clouddn.com/如果只是想快速搭建一个 Electron 的测试或开发环境,可以通过--dev参数只下载共享版本库:
$ ./script/bootstrap.py --dev$ ./script/build.py -c D
如果你遇到了一个错误,类似Command xxxx not found, 可以尝试使用VS2012 Command Prompt控制台来执行构建脚本 .
Fatal internal compiler error: C1001
确保你已经安装了 Visual Studio 的最新安装包 .
Assertion failed: ((handle))->activecnt >= 0
如果在 Cygwin 下构建的,你可能会看到bootstrap.py失败并且附带下面错误 :
Assertion failed: ((handle))->activecnt >= 0, file srcwinpipe.c, line 1430Traceback (most recent call last): File "script/bootstrap.py", line 87, in <module> sys.exit(main()) File "script/bootstrap.py", line 22, in main update_node_modules('.') File "script/bootstrap.py", line 56, in update_node_modules execute([NPM, 'install']) File "/home/zcbenz/codes/raven/script/lib/util.py", line 118, in execute raise esubprocess.CalledProcessError: Command '['npm.cmd', 'install']' returned non-zero exit status 3
调试 symbols 让你有更好的调试 sessions. 它们有可执行的动态库的函数信息,并且提供信息来获得洁净的呼叫栈. 一个 Symbol 服务器允许调试器自动加载正确的 symbols, 二进制文件 和 资源文件,不用再去强制用户下载巨大的调试文件. 服务器函数类似Microsoft's symbol server,所以这里的记录可用.
注意,因为公众版本的 Electron 构建是最优化的,调试不一定一直简单.调试器将不会给显示出所有变量内容,并且因为内联,尾调用,和其它编译器优化,执行路径会看起来很怪异 . 唯一的解决办法是搭建一个不优化的本地构建.
Electron 使用的官方 symbol 服务器地址为http://54.249.141.255:8086/atom-shell/symbols. 你不能直接访问这个路径,必须将其添加到你的调试工具的 symbol 路径上.在下面的例子中,使用了一个本地缓存目录来避免重复从服务器获取 PDB. 在你的电脑上使用一个恰当的缓存目录来代替c:codesymbols.
Using the Symbol Server in Windbg
Windbg symbol 路径被配制为一个限制带星号字符的字符串. 要只使用 Electron 的 symbol 服务器, 将下列记录添加到你的 symbol 路径 (注意:如果你愿意使用一个不同的地点来下载 symbols,你可以在你的电脑中使用任何可写的目录来代替c:codesymbols):
Microsoft 开发了一个工具,将 Electron 应用程序编译为 .appx 软件包,使开发人员能够使用新应用程序模型中的一些好东西。 本指南解释了如何使用它 - 以及 Electron AppX 包的功能和限制。
背景和要求
Windows 10 的 "周年更新" 能够运行 win32 .exe 程序并且它们的虚拟化文件系统和注册表跟随一起启动。 两者都是通过在 Windows 容器中运行应用程序和安装器编译后创建的,允许 Windows 在安装过程中正确识别操作系统进行了哪些修改。 将可执行文件和虚拟文件系统与虚拟注册表配对, 允许 Windows 启用一键安装和卸载。
您可以将 Electron 应用程序与不可见的 UWP 后台任务配对,以充分利用 Windows 10 功能,如推送通知,Cortana 集成或活动磁贴。
如何使用 Electron 应用程序通过后台任务发送 Toast 通知和活动磁贴,请查看微软提供的案例.
可选: 使用容器虚拟化进行转换
要生成 AppX 包,electron-windows-store CLI 使用的模板应该适用于大多数 Electron 应用程序。 但是,如果您使用自定义安装程序,或者您遇到生成的包的任何问题,您可以尝试使用 Windows 容器编译创建包 - 在该模式下,CLI 将在空 Windows 容器中安装和运行应用程序,以确定应用程序正在对操作系统进行哪些修改。