| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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", |
| | | }; |
| | | } |