[innosetup] add innosetup installer packer

This commit is contained in:
2019-09-03 16:26:06 +03:00
parent 524695b155
commit 414099bd67
6 changed files with 121 additions and 7 deletions

8
gulp-haxetool.iml Executable file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
haxetool/env.js Normal file → Executable file
View File

@@ -7,6 +7,10 @@ class Env {
process.env[key] = value; process.env[key] = value;
} }
static get(key) {
return process.env[key];
}
static addPath(value, key='PATH') { static addPath(value, key='PATH') {
if (!process.env[key]) { if (!process.env[key]) {
process.env[key] = value; process.env[key] = value;
@@ -17,4 +21,4 @@ class Env {
} }
module.exports = Env; module.exports = Env;

58
haxetool/innosetup.js Executable file
View File

@@ -0,0 +1,58 @@
const fs = require('fs');
const fse = require('fs-extra');
const os = require('os');
const path = require('path');
const Sdk = require('./sdk');
const exec = require('./exec');
const Env = require('./env');
const template = require('lodash.template');
class InnoSetup extends Sdk {
constructor(version) {
super(InnoSetup.ID, version || InnoSetup.VERSION);
}
get link() {
return 'http://www.jrsoftware.org/download.php/is.exe';
}
prepare(strip = 1) {
let result = super.prepare(strip);
if (!this.prepared) {
result = result.then(() => {
return exec(this.path, 'is.exe /VERYSILENT /SUPPRESSMSGBOXES');
});
}
return result;
}
get isccBin() {
return path.join(Env.get('ProgramFiles(x86)'), `Inno Setup ${this.version}`, 'ISCC.exe')
}
get prepared() {
try {
return fs.existsSync(this.isccBin);
} catch (e) {
return false;
}
}
pack(config, source, output) {
const buildDir = path.join(os.tmpdir(), 'build', config.name, 'innosetup');
const appTemplate = template(fs.readFileSync(path.resolve(__dirname, '..', 'template/windows/app.iss')));
const app = appTemplate({...config, buildDir: buildDir, output: output});
fse.ensureDirSync(buildDir);
fse.copySync(`${source}`, `${buildDir}`);
fs.writeFileSync(path.resolve(buildDir, 'app.iss'), app);
return exec(buildDir, [`"${this.isccBin}"`, 'app.iss'].join(' '));
}
}
InnoSetup.ID = 'innosetup';
InnoSetup.VERSION = '6';
module.exports = InnoSetup;

View File

@@ -7,6 +7,7 @@ const Haxe = require('./haxe');
const FlashPlayer = require('./flashplayer'); const FlashPlayer = require('./flashplayer');
const Android = require('./android'); const Android = require('./android');
const Neko = require('./neko'); const Neko = require('./neko');
const InnoSetup = require('./innosetup');
const Env = require('./env'); const Env = require('./env');
const debug = require('./debug'); const debug = require('./debug');
const webserver = require('gulp-webserver'); const webserver = require('gulp-webserver');
@@ -214,7 +215,7 @@ class LinuxDEBPacker extends Packer {
'fi' 'fi'
], ],
_target: '/', _target: '/',
_out: path.join(target, '..', 'debian'), _out: this.resolveTargetPath('debian'),
_clean: true, _clean: true,
_verbose: false _verbose: false
})); }));
@@ -248,6 +249,29 @@ LinuxArchivePacker.NAME = 'archive';
Packer.register(Platform.LINUX, LinuxArchivePacker.NAME, LinuxArchivePacker); Packer.register(Platform.LINUX, LinuxArchivePacker.NAME, LinuxArchivePacker);
/**
*
*/
class WindowsInstallerPacker extends Packer {
constructor(config) {
super(config, Platform.WINDOWS);
this.innosetup = new InnoSetup();
}
prepare() {
return this.innosetup.prepare();
}
call() {
return this.innosetup.pack(this.config, this.targetPath, this.resolveTargetPath('installer'));
}
}
WindowsInstallerPacker.NAME = 'installer';
Packer.register(Platform.WINDOWS, WindowsInstallerPacker.NAME, WindowsInstallerPacker);
/** /**
* *
*/ */

View File

@@ -63,13 +63,15 @@ class Downloader {
let stream = got.stream(url); let stream = got.stream(url);
stream = stream stream = stream
.on('request', r => { .on('request', r => {
bar.start(1, 0); if (bar) bar.start(1, 0);
}) })
.on('downloadProgress', p => { .on('downloadProgress', p => {
bar.setTotal(p.total); if (bar) {
bar.update(p.transferred); bar.setTotal(p.total);
if (p.total === p.transferred) { bar.update(p.transferred);
Downloader.releaseProgressBar(bar); if (p.total === p.transferred) {
Downloader.releaseProgressBar(bar);
}
} }
}); });
if (url.endsWith('.zip')) { if (url.endsWith('.zip')) {

18
template/windows/app.iss Executable file
View File

@@ -0,0 +1,18 @@
[Setup]
AppName=<%=meta.title%>
AppVersion=<%=meta.version%>
WizardStyle=modern
DefaultDirName={autopf}\<%=meta.filename%>
DefaultGroupName=<%=meta.title%>
UninstallDisplayIcon={app}\<%=meta.filename%>.exe
Compression=lzma2
SolidCompression=yes
OutputDir=<%=output%>
OutputBaseFilename=<%=meta.filename%>_<%=meta.version%>
[Files]
Source: *; Excludes: "*.iss,*.log"; DestDir: "{app}"; Flags: recursesubdirs
[Icons]
Name: "{group}\<%=meta.title%>"; Filename: "{app}\<%=meta.filename%>.exe"
Name: "{group}\Uninstall <%=meta.title%>"; Filename: "{uninstallexe}"