Files
agent-desktop/scripts/pack-tauri/sync_tauri_version.mjs
T
Pine 0613f5e031 fix: 打包脚本兼容 __version__.py 动态版本号格式
__version__.py 重构为从配置文件动态加载版本号(_load_versions),
不再是静态 __version__ = "x.y.z" 赋值,导致打包脚本 sed 正则提取
版本号失败(Version 为空 + sync_tauri_version.mjs 抛错)。

修复所有读取版本号的脚本,增加回退逻辑:
1. 先尝试旧格式 __version__ = "x.y.z"
2. 若为空,回退到 _DEFAULT_APP_VERSION = "x.y.z"

涉及文件:
- scripts/pack-tauri/sync_tauri_version.mjs(readPythonVersion)
- scripts/pack-tauri/build_macos_pyinstaller.sh
- scripts/pack-tauri/build_pyinstaller.sh
- scripts/pack/build_macos.sh
2026-09-08 00:19:14 +08:00

134 lines
4.1 KiB
JavaScript

// Sync the Python PEP 440 version from src/pineagents/__version__.py into a
// gitignored Tauri config override. Do not write the tracked tauri.conf.json:
// its version would otherwise become a stale generated value after rebases.
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
const repoRoot = path.resolve(scriptDir, "../..");
const versionFile = path.join(repoRoot, "src/pineagents/__version__.py");
const tauriConfigFile = path.join(
repoRoot,
"console/src-tauri/tauri.conf.json",
);
const tauriVersionConfigFile = path.join(
repoRoot,
"console/src-tauri/tauri.version.conf.json",
);
function readPythonVersion() {
const text = fs.readFileSync(versionFile, "utf8");
// 旧格式:__version__ = "x.y.z"
const staticMatch = text.match(/__version__\s*=\s*"([^"]+)"/);
if (staticMatch) return staticMatch[1];
// 新格式:版本号动态加载,回退到 _DEFAULT_APP_VERSION = "x.y.z"
const defaultMatch = text.match(/_DEFAULT_APP_VERSION\s*=\s*"([^"]+)"/);
if (defaultMatch) return defaultMatch[1];
throw new Error(`Could not read version from ${versionFile}`);
}
function toSemver(version) {
const match = version.match(
/^(\d+)\.(\d+)\.(\d+)(?:(a|b|rc)(\d+))?(?:\.post(\d+))?(?:\.dev(\d+))?$/,
);
if (!match) {
throw new Error(`Unsupported Python version for Tauri: ${version}`);
}
const [, major, minor, patch, prerelease, prereleaseNumber, post, dev] =
match;
const prereleaseMap = { a: "alpha", b: "beta", rc: "rc" };
const labels = [];
if (prerelease)
labels.push(`${prereleaseMap[prerelease]}.${prereleaseNumber}`);
if (dev) labels.push(`dev.${dev}`);
const prereleaseSuffix = labels.length ? `-${labels.join(".")}` : "";
const postMetadata = post ? `+post.${post}` : "";
return `${major}.${minor}.${patch}${prereleaseSuffix}${postMetadata}`;
}
function readBaseUpdaterConfig() {
const config = JSON.parse(fs.readFileSync(tauriConfigFile, "utf8"));
const updater = config?.plugins?.updater ?? {};
if (!updater.pubkey) {
throw new Error(
`Could not read plugins.updater.pubkey from ${tauriConfigFile}`,
);
}
return updater;
}
function readUpdaterEndpoints(baseUpdater) {
const raw = process.env.TAURI_UPDATER_ENDPOINTS?.trim();
if (!raw) return baseUpdater.endpoints;
if (raw.startsWith("[")) {
const parsed = JSON.parse(raw);
if (
!Array.isArray(parsed) ||
parsed.some((entry) => typeof entry !== "string")
) {
throw new Error(
"TAURI_UPDATER_ENDPOINTS JSON must be an array of strings",
);
}
return parsed;
}
return raw
.split(/[\n,]/)
.map((entry) => entry.trim())
.filter(Boolean);
}
function shouldCreateUpdaterArtifacts() {
return Boolean(process.env.TAURI_SIGNING_PRIVATE_KEY?.trim());
}
function writeTauriVersionConfig(file, version) {
const baseUpdater = readBaseUpdaterConfig();
const pubkey = process.env.TAURI_UPDATER_PUBKEY?.trim() || baseUpdater.pubkey;
const endpoints = readUpdaterEndpoints(baseUpdater);
const createUpdaterArtifacts = shouldCreateUpdaterArtifacts();
const config = {
version,
...(createUpdaterArtifacts
? {
bundle: {
createUpdaterArtifacts: true,
},
}
: {}),
plugins: {
updater: {
pubkey,
...(endpoints?.length ? { endpoints } : {}),
},
},
};
fs.writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`);
console.log(
`Using updater pubkey from ${
process.env.TAURI_UPDATER_PUBKEY?.trim()
? "TAURI_UPDATER_PUBKEY"
: "tauri.conf.json"
}`,
);
if (process.env.TAURI_UPDATER_ENDPOINTS?.trim()) {
console.log("Using updater endpoints from TAURI_UPDATER_ENDPOINTS");
}
console.log(
createUpdaterArtifacts
? "Creating Tauri updater artifacts"
: "Skipping Tauri updater artifacts because TAURI_SIGNING_PRIVATE_KEY is not set",
);
}
const semver = toSemver(readPythonVersion());
writeTauriVersionConfig(tauriVersionConfigFile, semver);
console.log(`Wrote Tauri version override ${semver}`);