Explorar o código

feat(nsis-gen): support custom installer and updater scripts

Evshiron Magicka %!s(int64=8) %!d(string=hai) anos
pai
achega
006b9c9560
Modificáronse 5 ficheiros con 117 adicións e 43 borrados
  1. 13 0
      docs/Options.md
  2. 82 42
      src/lib/Builder.ts
  3. 3 0
      src/lib/config/NsisConfig.ts
  4. 13 1
      src/lib/nsis-gen/index.ts
  5. 6 0
      test/nsis-gen.js

+ 13 - 0
docs/Options.md

@@ -49,3 +49,16 @@ modern | boolean | Whether to use Modern UI 2. Defaults to `true`.
 languages | string[] | Languages used in Modern UI 2. Multiple languages will result in a language selection dialog on startup. Defaults to `[ 'English' ]`.
 diffUpdaters | boolean | Whether to build diff updaters. Defaults to `false`.
 hashCalculation | boolean | Whether to calculate hashes for installers and updaters. Defaults to `true`.
+installerScript | string | Path to custom installer script. Defaults to `undefined`.
+updaterScript | string | Path to custom updater script. Defaults to `undefined`.
+
+## Custom NSIS Scripts
+
+Predefined symbols from `nwjs-builder-phoenix` via ` makensis /D`, haven't tested if it works:
+
+* NW_APPNAME
+* NW_COMPANYNAME
+* NW_DESCRIPTION
+* NW_VERSION
+* NW_COPYRIGHT
+* NW_OUTPUT

+ 82 - 42
src/lib/Builder.ts

@@ -343,35 +343,55 @@ export class Builder {
         const fromDir = resolve(this.dir, config.output, (await versionInfo.getVersion(fromVersion)).source);
         const toDir = resolve(this.dir, config.output, (await versionInfo.getVersion(toVersion)).source);
 
-        const data = await (new NsisDiffer(fromDir, toDir, {
+        if(config.nsis.customUpdaterScript) {
+
+            await nsisBuild(toDir, config.nsis.customUpdaterScript, {
+                defines: {
+                    NW_APPNAME: config.win.versionStrings.ProductName,
+                    NW_COMPANYNAME: config.win.versionStrings.CompanyName,
+                    NW_DESCRIPTION: config.win.versionStrings.FileDescription,
+                    NW_VERSION: config.win.productVersion,
+                    NW_COPYRIGHT: config.win.versionStrings.LegalCopyright,
+                    NW_OUTPUT: diffNsis,
+                },
+                mute: false,
+            });
 
-            // Basic.
-            appName: config.win.versionStrings.ProductName,
-            companyName: config.win.versionStrings.CompanyName,
-            description: config.win.versionStrings.FileDescription,
-            version: config.win.productVersion,
-            copyright: config.win.versionStrings.LegalCopyright,
+        }
+        else {
 
-            // Compression.
-            compression: 'lzma',
-            solid: true,
+            const data = await (new NsisDiffer(fromDir, toDir, {
 
-            modern: config.nsis.modern,
-            languages: config.nsis.languages,
+                // Basic.
+                appName: config.win.versionStrings.ProductName,
+                companyName: config.win.versionStrings.CompanyName,
+                description: config.win.versionStrings.FileDescription,
+                version: config.win.productVersion,
+                copyright: config.win.versionStrings.LegalCopyright,
 
-            // Output.
-            output: diffNsis,
+                // Compression.
+                compression: 'lzma',
+                solid: true,
 
-        })).make();
+                modern: config.nsis.modern,
+                languages: config.nsis.languages,
 
-        const script = await tmpName();
-        await writeFileAsync(script, data);
+                // Output.
+                output: diffNsis,
 
-        await nsisBuild(toDir, script, {
-            mute: false,
-        });
+            })).make();
+
+            const script = await tmpName();
+            await writeFileAsync(script, data);
 
-        await removeAsync(script);
+            await nsisBuild(toDir, script, {
+                defines: {},
+                mute: false,
+            });
+
+            await removeAsync(script);
+
+        }
 
         await versionInfo.addUpdater(toVersion, fromVersion, arch, diffNsis);
 
@@ -464,35 +484,55 @@ export class Builder {
 
         const targetNsis = resolve(dirname(targetDir), `${ basename(targetDir) }-Setup.exe`);
 
-        const data = await (new NsisComposer({
+        if(config.nsis.customInstallerScript) {
+
+            await nsisBuild(targetDir, config.nsis.customUpdaterScript, {
+                defines: {
+                    NW_APPNAME: config.win.versionStrings.ProductName,
+                    NW_COMPANYNAME: config.win.versionStrings.CompanyName,
+                    NW_DESCRIPTION: config.win.versionStrings.FileDescription,
+                    NW_VERSION: config.win.productVersion,
+                    NW_COPYRIGHT: config.win.versionStrings.LegalCopyright,
+                    NW_OUTPUT: targetNsis,
+                },
+                mute: false,
+            });
 
-            // Basic.
-            appName: config.win.versionStrings.ProductName,
-            companyName: config.win.versionStrings.CompanyName,
-            description: config.win.versionStrings.FileDescription,
-            version: config.win.productVersion,
-            copyright: config.win.versionStrings.LegalCopyright,
+        }
+        else {
 
-            // Compression.
-            compression: 'lzma',
-            solid: true,
+            const data = await (new NsisComposer({
 
-            modern: config.nsis.modern,
-            languages: config.nsis.languages,
+                // Basic.
+                appName: config.win.versionStrings.ProductName,
+                companyName: config.win.versionStrings.CompanyName,
+                description: config.win.versionStrings.FileDescription,
+                version: config.win.productVersion,
+                copyright: config.win.versionStrings.LegalCopyright,
 
-            // Output.
-            output: targetNsis,
+                // Compression.
+                compression: 'lzma',
+                solid: true,
 
-        })).make();
+                modern: config.nsis.modern,
+                languages: config.nsis.languages,
 
-        const script = await tmpName();
-        await writeFileAsync(script, data);
+                // Output.
+                output: targetNsis,
 
-        await nsisBuild(targetDir, script, {
-            mute: false,
-        });
+            })).make();
+
+            const script = await tmpName();
+            await writeFileAsync(script, data);
 
-        await removeAsync(script);
+            await nsisBuild(targetDir, script, {
+                defines: {},
+                mute: false,
+            });
+
+            await removeAsync(script);
+
+        }
 
         await versionInfo.addVersion(pkg.version, '', targetDir);
         await versionInfo.addInstaller(pkg.version, arch, targetNsis);

+ 3 - 0
src/lib/config/NsisConfig.ts

@@ -7,6 +7,9 @@ export class NsisConfig {
     public diffUpdaters: boolean = false;
     public hashCalculation: boolean = true;
 
+    public customInstallerScript: string = undefined;
+    public customUpdaterScript: string = undefined;
+
     constructor(options: any = {}) {
 
         Object.keys(this).map((key) => {

+ 13 - 1
src/lib/nsis-gen/index.ts

@@ -9,18 +9,30 @@ const DIR_ASSETS = resolve(dirname(module.filename), '../../../assets/');
 const DIR_NSIS = resolve(DIR_ASSETS, 'nsis');
 
 interface INsisBuildOptions {
+    defines: { [key: string]: string };
     mute: boolean;
 }
 
 export async function nsisBuild(cwd: string, script: string, options: INsisBuildOptions = {
+    defines: {},
     mute: false,
 }) {
 
-    const args = [ win32.normalize(resolve(DIR_NSIS, 'makensis.exe')), '/NOCD', win32.normalize(resolve(script)) ];
+    options.defines = options.defines ? options.defines : {};
+    options.mute = options.mute ? true : false;
+
+    const args = [ win32.normalize(resolve(DIR_NSIS, 'makensis.exe')), '/WX', '/NOCD' ];
+
+    for(const key in options.defines) {
+        args.push(`/D${ key }="${ options.defines[key] }"`);
+    }
+
     if(process.platform != 'win32') {
         args.unshift('wine');
     }
 
+    args.push(win32.normalize(resolve(script)));
+
     const child = spawn(args.shift(), args, {
         cwd,
     });

+ 6 - 0
test/nsis-gen.js

@@ -71,3 +71,9 @@ test('diff', async (t) => {
     await removeAsync(script);
 
 });
+
+test('custom', (t) => {
+
+    // TODO:
+
+});