Electron electron-winstaller 为 Msi 设置安装路径

Posted

技术标签:

【中文标题】Electron electron-winstaller 为 Msi 设置安装路径【英文标题】:Electron electron-winstaller Set Installation Path for Msi 【发布时间】:2017-03-11 03:29:00 【问题描述】:

我正在使用 Electron 和 Angular2 为 Windows 创建桌面应用程序,并且可以成功生成 .exe 和 .msi 文件进行安装。我使用电子打包器来打包我的电子应用程序 packaged electron app

打包应用程序后,我使用 electron-winstaller 从包中生成一个 msi

当我运行 .msi 文件时,它会自动将我的项目安装到 C:\Users\Username\AppData\Local\ApplicationName 。双击 msi 时唯一的事情是这个简短的对话框: dialog

不过,我想要的是安装程序提示我应该安装应用程序的位置。我希望能够在安装的时候设置安装路径。

我还应该提到我尝试使用电子生成器,并且还可以生成 msi 文件。但是这里我也无法设置安装路径。我发现了这个 Electron create MSI installer using electron-builder 问题,其他人对电子生成器有同样的问题,但他的问题没有答案。

这是我对电子 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`));

这是我的 package.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"
  

我可能需要证书吗? Windows安装程序询问安装位置不是默认设置吗?

【问题讨论】:

【参考方案1】:

electron-winstaller 使用 squirrel 生成安装文件。根据他们的documentation,安装路径“实际上是不可变的”并且硬设置为 \%LocalAppData%\AppName

安装位置

MyApp 中的 Setup.exe 和之后的 UpdateManager 必须具有 将文件写入应用程序并从应用程序执行文件的能力 安装位置。为确保所有类型用户的权限, 选择用户的应用程序数据目录作为安装位置 (即 %LocalAppData%\MyApp)。

安装根目录真的只需要包含两种 文件夹:

Packages - 用于下载和组装更新包的文件夹 文件。应用程序文件夹 - 给定的“已安装”应用程序文件 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 包目录实际上是不可变的,它只包含我们下载的包。使用用户的 本地应用程序数据目录意味着我们需要的写入权限 到每个用户的安装目录。

提示:有关确保您的 应用程序推送给企业环境中的所有用户。

在机器范围内安装的方法是使用仅在下次用户登录时触发安装的 MSI:

机器范围的安装

Squirrel 的 Releasify 命令会生成一个适用于 通过组策略安装。此 MSI 不是通用的 安装程序,这意味着一旦您运行 MSI,用户从现在开始 将在下次登录时安装应用程序。

所以,大多数普通用户应该继续运行生成的 Setup.exe 由 Releasify 提供,但如果您想要一个 IT 管理员友好的版本, 你可以交出 MSI

大多数 Squirrel 用户无需执行任何新操作即可启用此功能 行为,尽管某些 NuGet 包 ID / 名称可能会导致 MSI 的问题。

【讨论】:

感谢您花时间回答。我们最终这样做了,但这并不是我们真正想要的解决方案。如果安装该软件的用户可以直接选择他希望将其安装到哪个目录而不是通过策略权限设置它,那就更好了。

以上是关于Electron electron-winstaller 为 Msi 设置安装路径的主要内容,如果未能解决你的问题,请参考以下文章

用electron将Vue项目打包为window和Mac桌面应用 (electron-packager与electron-build)

03、electron-builder打包命令报错

vue+electron打包不能网络请求

Electron——查看Electron的版本

Electron——查看Electron的版本

electron(electron-vue)环境下配置gRPC