I'm using Electron and Angular2 to create a desktop application for Windows, and can successfully generate the .exe and .msi files for installation. I use electron-packager to package my electron app packaged electron app
我使用电子和Angular2为Windows创建一个桌面应用程序,并且可以成功地生成.exe和.msi文件来安装。我用电子包装器包装我的电子应用程序包装电子应用。
After packaging the app I use electron-winstaller to generate an msi from the package
在打包后,我使用电子winstaller从包中生成msi。
When I run the .msi file though, It automatically installs my project to C:\Users\Username\AppData\Local\ApplicationName . The only thing when double clicking on the msi is this short dialog: dialog
但是,当我运行.msi文件时,它会自动地将我的项目安装到c:) usersusernamelocal\ ApplicationName。当双击msi时,唯一的事情就是这个简短的对话框:对话框。
What I would like though, is for the installer to prompt me to where it should install the application. I want to be able to set the installation path when installing.
但是,我希望安装程序能够提示我在哪里安装应用程序。我希望在安装时能够设置安装路径。
I should also mention that I tried using electron-builder, and could also generate the msi file. But here I could also not set the installation path. I found this Electron create MSI installer using electron-builder issue where someone else had the same problem with electron-builder, but there was no answer to his question.
我还应该提到,我尝试使用电子构建器,也可以生成msi文件。但这里我也不能设置安装路径。我发现这个电子制造了MSI安装程序,它使用的是电子制造的问题,在这个问题上,其他人也有同样的问题,但他的问题没有答案。
Here is my configuration for electron-winstaller. The winstaller.js file is located at the root of my project:
这是我的电子winstaller的配置。winstaller。js文件位于我项目的根目录:
var electrOnInstaller= require('electron-winstaller');
var resultPromise = electronInstaller.createWindowsInstaller(
{
appDirectory: '../installer/sda-win32-x64',
outputDirectory: '../installer',
authors: 'SORA Desktop Application',
exe: 'sda.exe',
setupExe: 'SDASetup.exe',
setupMsi: 'SDASetup.msi',
iconUrl: 'file:///d/dev/sda/client/src/app/assets/images/icon.ico',
setupIcon: 'src/app/assets/images/icon.ico'
});
resultPromise.then(() => console.log('It worked!'), e => console.log(`No dice: ${e.message}`));
Here is my package.json configuration. This is also located at the root of my project
这是我的包。json配置。这也是我项目的根。
{
"name": "sda",
"description": "SDA 3.0",
"version": "0.0.1",
"main": "gulpfile.js",
"keywords": [
"Angular",
"Angular2",
"Electron",
"Typescript"
],
"author": "Vic",
"license": "MIT",
"scripts": {
"build": "gulp build",
"start": "npm run build && electron ./dist/index.js",
"package": "npm run build && gulp electron:package",
"postinstall": "concurrently \"bower install\" \"typings install\"",
"appstart": "electron ./dist/index.js",
"test": "gulp test",
"deploy": "rm -rf ../installer && gulp setInDevelopmentFlagToFalse && cp src/app/environment/environment.prod.ts src/app/environment/environment.ts && npm run build && cd dist && electron-packager . --platform=win32 --arch=x64 --overwrite=true --out=../../installer --icon=assets/images/icon.ico && cd ../ && gulp setInDevelopmentFlagToTrue && cp src/app/environment/environment.dev.ts src/app/environment/environment.ts && node winstaller.js"
},
"dependencies": {
"@angular/common": "2.0.0",
"@angular/compiler": "2.0.0",
"@angular/core": "2.0.0",
"@angular/forms": "2.0.0",
"@angular/http": "2.0.0",
"@angular/platform-browser": "2.0.0",
"@angular/platform-browser-dynamic": "2.0.0",
"@angular/router": "3.0.0",
"@angular/upgrade": "2.0.0",
"@ng-bootstrap/ng-bootstrap": "1.0.0-alpha.8",
"@types/hammerjs": "2.0.33",
"@types/sjcl": "1.0.27",
"angular2-jwt": "0.1.23",
"angular2-moment": "1.0.0-beta.5",
"angular2localization": "1.0.2",
"bootstrap": "4.0.0-alpha.4",
"core-js": "2.4.1",
"file-saver": "1.3.3",
"font-awesome": "4.6.3",
"jquery": "3.1.1",
"moment": "2.15.2",
"normalize.css": "5.0.0",
"reflect-metadata": "0.1.3",
"rxjs": "5.0.0-beta.12",
"sjcl": "1.0.6",
"systemjs": "0.19.27",
"tether": "1.3.7",
"zone.js": "0.6.23"
},
"devDependencies": {
"bower": "1.7.9",
"concurrently": "2.2.0",
"del": "2.2.0",
"electron": "1.3.5",
"electron-connect": "0.6.0",
"electron-packager": "8.1.0",
"electron-prebuilt": "1.3.8",
"electron-winstaller": "2.3.4",
"eslint": "3.6.0",
"eslint-config-google": "0.6.0",
"eslint-plugin-html": "1.5.3",
"gulp": "3.9.1",
"gulp-atom-electron": "1.9.0",
"gulp-concat": "2.6.0",
"gulp-replace": "^0.5.4",
"gulp-sass": "2.3.1",
"gulp-shell": "0.5.2",
"gulp-symdest": "1.0.0",
"gulp-typescript": "3.0.2",
"hammerjs": "2.0.8",
"jasmine-core": "2.5.2",
"karma": "1.3.0",
"karma-chrome-launcher": "2.0.0",
"karma-cli": "1.0.1",
"karma-htmlfile-reporter": "0.3.4",
"karma-jasmine": "1.0.2",
"karma-jasmine-html-reporter": "0.2.2",
"karma-sourcemap-loader": "0.3.7",
"karma-typescript-preprocessor": "0.3.0",
"run-sequence": "1.1.5",
"typescript": "2.0.2",
"typings": "1.3.2"
}
}
Do I maybe need a certificate ? Is it not a default setting for the windows installer to ask where to install?
我需要证书吗?它不是windows安装程序要求安装在哪里的默认设置吗?
0
electron-winstaller uses squirrel to generate the setup files. According to their documentation, the install path is "effectively immutable" and hard set to \%LocalAppData%\AppName :
电子winstaller使用squirrel来生成安装文件。根据他们的文档,安装路径是“有效不可变的”,并且很难设置为\%LocalAppData%\AppName:
Install Location
安装位置
The Setup.exe, and later the UpdateManager in MyApp must have the ability to write files to and execute files from the application install location. To ensure permission for all types of users, the user's application data directory is selected as the install location (i.e., %LocalAppData%\MyApp).
的设置。exe,然后MyApp中的UpdateManager必须能够从应用程序安装位置写入文件并执行文件。为了确保对所有类型的用户的权限,用户的应用程序数据目录被选择为安装位置(即:,% LocalAppData % \ MyApp)。
The installation root really only needs to consist of two types of folders:
安装根实际上只需要包含两种类型的文件夹:
Packages - folder used to download and assemble the update package files. App Folders - the "installed" application files for a given version of MyApp. \%LocalAppData%\MyApp \packages MyApp-1.0.0.nupkg MyApp-1.0.1-delta.nupkg MyApp-1.0.1.nupkg \app-1.0.0 MyApp.exe \app-1.0.1 MyApp.exe The packages directory is effectively immutable, it simply consists of the packages we've downloaded. Using the user's local application data directory means that we the needed write-access to the install directory on a per-user basis.
软件包-用于下载和组装更新包文件的文件夹。App文件夹-为某一版本的MyApp“安装”的应用程序文件。MyApp-1.0.0 \ % LocalAppData % \ MyApp \包。nupkg MyApp-1.0.1-delta。nupkg MyApp-1.0.1。nupkg \ app-1.0.0 MyApp。exe \ app-1.0.1 MyApp。exe包目录实际上是不可变的,它只包含我们下载的包。使用用户的本地应用程序数据目录意味着我们需要在每个用户基础上对安装目录进行写访问。
Tip: See Machine-wide Installs for more information on ensuring your application pushed to all users in an enterprise environment.
提示:请参阅机器广泛的安装,以获得关于确保您的应用程序在企业环境中向所有用户推送的更多信息。
The method for installing machine wide is to use the MSI which only triggers installation on the next user login:
安装机器宽的方法是使用MSI,它只会在下一次用户登录时触发安装:
Machine-wide Installs
改变机器安装
Squirrel's Releasify command generates an MSI file suitable for installation via Group Policy. This MSI isn't a general-purpose installer, this means that once you run the MSI, users from now on will get the app installed, on next Login.
Squirrel的Releasify命令生成一个MSI文件,适合通过组策略安装。这个MSI不是一个通用的安装程序,这意味着一旦你运行MSI,从现在开始的用户将会在下次登录时安装应用程序。
So, most normal users should continue to run the Setup.exe's generated by Releasify, but if you want to have an IT Admin Friendly version, you can hand off the MSI
因此,大多数正常用户应该继续运行安装程序。exe是由Releasify生成的,但是如果您想要一个IT管理友好的版本,您可以手动关闭MSI。
Most users of Squirrel won't have to do anything new to enable this behavior, though certain NuGet package IDs / names might cause problems with MSI.
大多数Squirrel用户不需要做任何新的操作来启用这种行为,尽管某些NuGet包id /名称可能会导致MSI出现问题。