mirror of
				https://github.com/tobspr/shapez.io.git
				synced 2025-06-13 13:04:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			236 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| require("colors");
 | |
| const packager = require("electron-packager");
 | |
| const path = require("path");
 | |
| const { getVersion } = require("./buildutils");
 | |
| const fs = require("fs");
 | |
| const fse = require("fs-extra");
 | |
| const buildutils = require("./buildutils");
 | |
| const execSync = require("child_process").execSync;
 | |
| 
 | |
| function gulptasksStandalone($, gulp) {
 | |
|     const electronBaseDir = path.join(__dirname, "..", "electron");
 | |
| 
 | |
|     const tempDestDir = path.join(__dirname, "..", "tmp_standalone_files");
 | |
|     const tempDestBuildDir = path.join(tempDestDir, "built");
 | |
| 
 | |
|     gulp.task("standalone.prepare.cleanup", () => {
 | |
|         return gulp.src(tempDestDir, { read: false, allowEmpty: true }).pipe($.clean({ force: true }));
 | |
|     });
 | |
| 
 | |
|     gulp.task("standalone.prepare.copyPrefab", () => {
 | |
|         // const requiredFiles = $.glob.sync("../electron/");
 | |
|         const requiredFiles = [
 | |
|             path.join(electronBaseDir, "lib", "**", "*.node"),
 | |
|             path.join(electronBaseDir, "node_modules", "**", "*.*"),
 | |
|             path.join(electronBaseDir, "node_modules", "**", ".*"),
 | |
|             path.join(electronBaseDir, "favicon*"),
 | |
| 
 | |
|             // fails on platforms which support symlinks
 | |
|             // https://github.com/gulpjs/gulp/issues/1427
 | |
|             // path.join(electronBaseDir, "node_modules", "**", "*"),
 | |
|         ];
 | |
|         return gulp.src(requiredFiles, { base: electronBaseDir }).pipe(gulp.dest(tempDestBuildDir));
 | |
|     });
 | |
| 
 | |
|     gulp.task("standalone.prepare.writePackageJson", cb => {
 | |
|         fs.writeFileSync(
 | |
|             path.join(tempDestBuildDir, "package.json"),
 | |
|             JSON.stringify(
 | |
|                 {
 | |
|                     devDependencies: {
 | |
|                         electron: "6.1.12",
 | |
|                     },
 | |
|                 },
 | |
|                 null,
 | |
|                 4
 | |
|             )
 | |
|         );
 | |
|         cb();
 | |
|     });
 | |
| 
 | |
|     gulp.task("standalone.prepareVDF", cb => {
 | |
|         const hash = buildutils.getRevision();
 | |
| 
 | |
|         const steampipeDir = path.join(__dirname, "steampipe", "scripts");
 | |
|         const templateContents = fs
 | |
|             .readFileSync(path.join(steampipeDir, "app.vdf.template"), { encoding: "utf-8" })
 | |
|             .toString();
 | |
| 
 | |
|         const convertedContents = templateContents.replace("$DESC$", "Commit " + hash);
 | |
|         fs.writeFileSync(path.join(steampipeDir, "app.vdf"), convertedContents);
 | |
| 
 | |
|         cb();
 | |
|     });
 | |
| 
 | |
|     gulp.task("standalone.prepare.minifyCode", () => {
 | |
|         return gulp.src(path.join(electronBaseDir, "*.js")).pipe(gulp.dest(tempDestBuildDir));
 | |
|     });
 | |
| 
 | |
|     gulp.task("standalone.prepare.copyGamefiles", () => {
 | |
|         return gulp.src("../build/**/*.*", { base: "../build" }).pipe(gulp.dest(tempDestBuildDir));
 | |
|     });
 | |
| 
 | |
|     gulp.task("standalone.killRunningInstances", cb => {
 | |
|         try {
 | |
|             execSync("taskkill /F /IM shapezio.exe");
 | |
|         } catch (ex) {
 | |
|             console.warn("Failed to kill running instances, maybe none are up.");
 | |
|         }
 | |
|         cb();
 | |
|     });
 | |
| 
 | |
|     gulp.task(
 | |
|         "standalone.prepare",
 | |
|         gulp.series(
 | |
|             "standalone.killRunningInstances",
 | |
|             "standalone.prepare.cleanup",
 | |
|             "standalone.prepare.copyPrefab",
 | |
|             "standalone.prepare.writePackageJson",
 | |
|             "standalone.prepare.minifyCode",
 | |
|             "standalone.prepare.copyGamefiles"
 | |
|         )
 | |
|     );
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param {'win32'|'linux'|'darwin'} platform
 | |
|      * @param {'x64'|'ia32'} arch
 | |
|      * @param {function():void} cb
 | |
|      * @param {boolean=} isRelease
 | |
|      */
 | |
|     function packageStandalone(platform, arch, cb, isRelease = true) {
 | |
|         const tomlFile = fs.readFileSync(path.join(__dirname, ".itch.toml"));
 | |
| 
 | |
|         packager({
 | |
|             dir: tempDestBuildDir,
 | |
|             appCopyright: "Tobias Springer",
 | |
|             appVersion: getVersion(),
 | |
|             buildVersion: "1.0.0",
 | |
|             arch,
 | |
|             platform,
 | |
|             asar: true,
 | |
|             executableName: "shapezio",
 | |
|             icon: path.join(electronBaseDir, "favicon"),
 | |
|             name: "shapez.io-standalone",
 | |
|             out: tempDestDir,
 | |
|             overwrite: true,
 | |
|             appBundleId: "io.shapez.standalone",
 | |
|             appCategoryType: "public.app-category.games",
 | |
|             ...(isRelease &&
 | |
|                 platform === "darwin" && {
 | |
|                     osxSign: {
 | |
|                         "identity": process.env.SHAPEZ_CLI_APPLE_CERT_NAME,
 | |
|                         "hardened-runtime": true,
 | |
|                         "hardenedRuntime": true,
 | |
|                         "entitlements": "entitlements.plist",
 | |
|                         "entitlements-inherit": "entitlements.plist",
 | |
|                         "signature-flags": "library",
 | |
|                     },
 | |
|                     osxNotarize: {
 | |
|                         appleId: process.env.SHAPEZ_CLI_APPLE_ID,
 | |
|                         appleIdPassword: "@keychain:SHAPEZ_CLI_APPLE_ID",
 | |
|                     },
 | |
|                 }),
 | |
|         }).then(
 | |
|             appPaths => {
 | |
|                 console.log("Packages created:", appPaths);
 | |
|                 appPaths.forEach(appPath => {
 | |
|                     if (!fs.existsSync(appPath)) {
 | |
|                         console.error("Bad app path gotten:", appPath);
 | |
|                         return;
 | |
|                     }
 | |
| 
 | |
|                     fs.writeFileSync(
 | |
|                         path.join(appPath, "LICENSE"),
 | |
|                         fs.readFileSync(path.join(__dirname, "..", "LICENSE"))
 | |
|                     );
 | |
| 
 | |
|                     fs.writeFileSync(path.join(appPath, ".itch.toml"), tomlFile);
 | |
| 
 | |
|                     if (platform === "linux") {
 | |
|                         fs.writeFileSync(
 | |
|                             path.join(appPath, "play.sh"),
 | |
|                             '#!/usr/bin/env bash\n./shapezio --no-sandbox "$@"\n'
 | |
|                         );
 | |
|                         fs.chmodSync(path.join(appPath, "play.sh"), 0o775);
 | |
|                     }
 | |
| 
 | |
|                     if (process.platform === "win32" && platform === "darwin") {
 | |
|                         console.warn(
 | |
|                             "Cross-building for macOS on Windows: dereferencing symlinks.\n".red +
 | |
|                                 "This will nearly double app size and make code signature invalid. Sorry!\n"
 | |
|                                     .red.bold +
 | |
|                                 "For more information, see " +
 | |
|                                 "https://github.com/electron/electron-packager/issues/71".underline
 | |
|                         );
 | |
| 
 | |
|                         // Clear up framework folders
 | |
|                         fs.writeFileSync(
 | |
|                             path.join(appPath, "play.sh"),
 | |
|                             '#!/usr/bin/env bash\n./shapez.io-standalone.app/Contents/MacOS/shapezio --no-sandbox "$@"\n'
 | |
|                         );
 | |
|                         fs.chmodSync(path.join(appPath, "play.sh"), 0o775);
 | |
|                         fs.chmodSync(
 | |
|                             path.join(appPath, "shapez.io-standalone.app", "Contents", "MacOS", "shapezio"),
 | |
|                             0o775
 | |
|                         );
 | |
| 
 | |
|                         const finalPath = path.join(appPath, "shapez.io-standalone.app");
 | |
| 
 | |
|                         const frameworksDir = path.join(finalPath, "Contents", "Frameworks");
 | |
|                         const frameworkFolders = fs
 | |
|                             .readdirSync(frameworksDir)
 | |
|                             .filter(fname => fname.endsWith(".framework"));
 | |
| 
 | |
|                         for (let i = 0; i < frameworkFolders.length; ++i) {
 | |
|                             const folderName = frameworkFolders[i];
 | |
|                             const frameworkFolder = path.join(frameworksDir, folderName);
 | |
|                             console.log(" -> ", frameworkFolder);
 | |
| 
 | |
|                             const filesToDelete = fs
 | |
|                                 .readdirSync(frameworkFolder)
 | |
|                                 .filter(fname => fname.toLowerCase() !== "versions");
 | |
|                             filesToDelete.forEach(fname => {
 | |
|                                 console.log("    -> Deleting", fname);
 | |
|                                 fs.unlinkSync(path.join(frameworkFolder, fname));
 | |
|                             });
 | |
| 
 | |
|                             const frameworkSourceDir = path.join(frameworkFolder, "Versions", "A");
 | |
|                             fse.copySync(frameworkSourceDir, frameworkFolder);
 | |
|                         }
 | |
|                     }
 | |
|                 });
 | |
| 
 | |
|                 cb();
 | |
|             },
 | |
|             err => {
 | |
|                 console.error("Packaging error:", err);
 | |
|                 cb();
 | |
|             }
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     gulp.task("standalone.package.prod.win64", cb => packageStandalone("win32", "x64", cb));
 | |
|     gulp.task("standalone.package.prod.win32", cb => packageStandalone("win32", "ia32", cb));
 | |
|     gulp.task("standalone.package.prod.linux64", cb => packageStandalone("linux", "x64", cb));
 | |
|     gulp.task("standalone.package.prod.linux32", cb => packageStandalone("linux", "ia32", cb));
 | |
|     gulp.task("standalone.package.prod.darwin64", cb => packageStandalone("darwin", "x64", cb));
 | |
|     gulp.task("standalone.package.prod.darwin64.unsigned", cb =>
 | |
|         packageStandalone("darwin", "x64", cb, false)
 | |
|     );
 | |
| 
 | |
|     gulp.task(
 | |
|         "standalone.package.prod",
 | |
|         gulp.series(
 | |
|             "standalone.prepare",
 | |
|             gulp.parallel(
 | |
|                 "standalone.package.prod.win64",
 | |
|                 "standalone.package.prod.linux64",
 | |
|                 "standalone.package.prod.darwin64"
 | |
|             )
 | |
|         )
 | |
|     );
 | |
| }
 | |
| 
 | |
| module.exports = { gulptasksStandalone };
 |