import fs from "fs/promises";
|
import fsSync from "fs";
|
import path from "path";
|
import { fileURLToPath } from "url";
|
import { execSync } from "child_process";
|
|
const __filename = fileURLToPath(import.meta.url);
|
const __dirname = path.dirname(__filename);
|
|
const data = await fs.readFile(path.join(__dirname, "config.json"), "utf-8");
|
const config = JSON.parse(data);
|
|
const rootPath = path.resolve(__dirname, "..");
|
const resourcePath = path.join(rootPath, "multiple", "assets");
|
const replacePath = path.join(rootPath, "replace");
|
const envFilePath = path.join(rootPath, ".env.production.local");
|
|
const params = parseArgs(process.argv);
|
const company = resolveCompany(params);
|
const companyMap = config[company];
|
|
if (!companyMap) {
|
const availableCompanies = Object.entries(config)
|
.filter(([, value]) => value && typeof value === "object" && value.env)
|
.map(([key]) => key)
|
.sort();
|
throw new Error(
|
`未知 company: "${company}"。可选值: ${availableCompanies.join(", ")}`
|
);
|
}
|
|
console.log(`当前 company: ${company}`);
|
|
async function copyFileWithOverwrite(src, dest) {
|
await fs.mkdir(path.dirname(dest), { recursive: true });
|
if (fsSync.existsSync(dest)) {
|
try {
|
await fs.chmod(dest, 0o666);
|
} catch {
|
// Ignore chmod failure and continue.
|
}
|
await fs.rm(dest, { force: true });
|
}
|
await fs.copyFile(src, dest);
|
}
|
|
try {
|
console.log("=======生成.env=======");
|
const envContent =
|
Object.entries(companyMap.env)
|
.map(([key, value]) => `${key}='${value}'`)
|
.join("\n") + "\n";
|
await fs.writeFile(envFilePath, envContent, "utf-8");
|
|
console.log("=======修改资源=======");
|
for (const [key] of Object.entries(companyMap)) {
|
if (key === "env") continue;
|
|
const originFile = path.join(rootPath, config[key]);
|
const backupFile = path.join(replacePath, config[key]);
|
const replaceFile = path.join(resourcePath, companyMap[key]);
|
|
await copyFileWithOverwrite(originFile, backupFile);
|
await copyFileWithOverwrite(replaceFile, originFile);
|
}
|
|
console.log("=====开始打包=====");
|
const buildEnv = createBuildEnv(companyMap.env);
|
execSync("vite build", { stdio: "inherit", cwd: rootPath, env: buildEnv });
|
console.log("=====打包完成======");
|
} finally {
|
console.log("=====恢复资源======");
|
|
if (fsSync.existsSync(envFilePath)) {
|
await fs.unlink(envFilePath);
|
console.log(`🗑️ 已删除 ${envFilePath}`);
|
}
|
|
if (fsSync.existsSync(replacePath)) {
|
for (const [key] of Object.entries(companyMap)) {
|
if (key === "env") continue;
|
|
const originFile = path.join(rootPath, config[key]);
|
const backupFile = path.join(replacePath, config[key]);
|
await copyFileWithOverwrite(backupFile, originFile);
|
}
|
await fs.rm(replacePath, { recursive: true, force: true });
|
console.log(`🗑️ 已删除 ${replacePath}`);
|
}
|
}
|
|
function parseArgs(argv) {
|
const params = {};
|
for (let index = 2; index < argv.length; index++) {
|
const arg = argv[index];
|
if (!arg.startsWith("--")) continue;
|
|
const normalized = arg.slice(2);
|
const equalIndex = normalized.indexOf("=");
|
if (equalIndex >= 0) {
|
const key = normalized.slice(0, equalIndex);
|
const value = normalized.slice(equalIndex + 1);
|
params[key] = value || true;
|
continue;
|
}
|
|
const nextArg = argv[index + 1];
|
if (nextArg && !nextArg.startsWith("--")) {
|
params[normalized] = nextArg;
|
index += 1;
|
continue;
|
}
|
|
params[normalized] = true;
|
}
|
return params;
|
}
|
|
function resolveCompany(parsedParams) {
|
const fromArg = parseValue(parsedParams.company);
|
if (fromArg) return fromArg;
|
|
const fromNpmConfig = parseValue(process.env.npm_config_company);
|
if (fromNpmConfig) return fromNpmConfig;
|
|
const fromEnv = parseValue(process.env.COMPANY ?? process.env.company);
|
if (fromEnv) return fromEnv;
|
|
return "default";
|
}
|
|
function parseValue(value) {
|
if (value == null || value === true) return undefined;
|
if (typeof value !== "string") return undefined;
|
const trimmed = value.trim();
|
if (!trimmed) return undefined;
|
return trimmed.replace(/^["']|["']$/g, "");
|
}
|
|
function createBuildEnv(companyEnv) {
|
const env = { ...process.env };
|
for (const key of Object.keys(env)) {
|
if (key.startsWith("VITE_")) {
|
delete env[key];
|
}
|
}
|
return {
|
...env,
|
...companyEnv,
|
VITE_APP_ENV: "production",
|
};
|
}
|