fix(push): 支持提交被忽略的 Java 模板产物

- 强制暂存 templates 下当前应用的构建产物
- 限制差异检测和提交范围,避免影响 Java 仓库其他文件
- 增加 Java 模板目标路径测试和使用说明
master
LiuJiaNan 2026-08-26 09:50:28 +08:00
parent 240caf3c66
commit 8d92f20aa0
3 changed files with 39 additions and 6 deletions

View File

@ -68,6 +68,8 @@ start/src/main/resources/templates/<appIdentifier>.html
start/src/main/resources/templates/<appIdentifier>/ start/src/main/resources/templates/<appIdentifier>/
``` ```
工具只暂存和提交当前应用在 `templates` 下的目录及 HTML不会提交 Java 仓库其他路径的文件。
## 发布到 npm Registry ## 发布到 npm Registry
登录 Registry 登录 Registry

View File

@ -7,8 +7,9 @@ const { ensureYarnAvailable, runYarn } = require('./package-manager');
const DEFAULT_BRANCH = 'master'; const DEFAULT_BRANCH = 'master';
const CONFIG_FILE_NAME = 'jjb.config.js'; const CONFIG_FILE_NAME = 'jjb.config.js';
const JAVA_TEMPLATE_PATH_PARTS = ['start', 'src', 'main', 'resources', 'templates'];
// 前端构建产物在 Java 仓库中的固定部署目录。 // 前端构建产物在 Java 仓库中的固定部署目录。
const JAVA_TEMPLATE_PATH = path.join('start', 'src', 'main', 'resources', 'templates'); const JAVA_TEMPLATE_PATH = path.join(...JAVA_TEMPLATE_PATH_PARTS);
function run(command, args, cwd) { function run(command, args, cwd) {
// Git 命令同步执行并继承终端输出,失败时由 execFileSync 直接抛出异常。 // Git 命令同步执行并继承终端输出,失败时由 execFileSync 直接抛出异常。
@ -94,6 +95,13 @@ function resolveBuildScript(buildScripts, environment) {
return buildScript; return buildScript;
} }
function getJavaTargetPaths(appIdentifier) {
return [
path.posix.join(...JAVA_TEMPLATE_PATH_PARTS, appIdentifier),
path.posix.join(...JAVA_TEMPLATE_PATH_PARTS, `${appIdentifier}.html`),
];
}
function ensureDependencies(projectRoot) { function ensureDependencies(projectRoot) {
// 业务项目没有 node_modules 时才安装依赖,并且始终使用 Yarn。 // 业务项目没有 node_modules 时才安装依赖,并且始终使用 Yarn。
if (fs.existsSync(path.join(projectRoot, 'node_modules'))) { if (fs.existsSync(path.join(projectRoot, 'node_modules'))) {
@ -190,9 +198,17 @@ async function pushJava({ environment: environmentArgument } = {}) {
// 第 6 步:把前端 dist 产物复制到 Java 仓库的 resources/templates 目录。 // 第 6 步:把前端 dist 产物复制到 Java 仓库的 resources/templates 目录。
copyBuildOutput(projectRoot, javaRepository, config.appIdentifier); copyBuildOutput(projectRoot, javaRepository, config.appIdentifier);
// 第 7 步:下面所有 Git 命令都在临时 Java 仓库中执行。 // 第 7 步:-f 允许暂存被 Java 仓库 .gitignore 忽略的模板,-A 同时记录新增、修改和删除。
run('git', ['add', '.'], javaRepository); const javaTargetPaths = getJavaTargetPaths(config.appIdentifier);
const changedFiles = childProcess.execFileSync('git', ['status', '--porcelain'], { run('git', ['add', '-A', '-f', '--', ...javaTargetPaths], javaRepository);
// 只检查当前应用在 templates 下的暂存内容,不处理 Java 仓库其他路径。
const changedFiles = childProcess.execFileSync('git', [
'diff',
'--cached',
'--name-only',
'--',
...javaTargetPaths,
], {
cwd: javaRepository, cwd: javaRepository,
encoding: 'utf8', encoding: 'utf8',
}).trim(); }).trim();
@ -206,8 +222,17 @@ async function pushJava({ environment: environmentArgument } = {}) {
const defaultMessage = `zy-gbs-cmd: update ${config.appIdentifier}`; const defaultMessage = `zy-gbs-cmd: update ${config.appIdentifier}`;
const message = (await input.question(`请输入提交信息 (${defaultMessage}): `)).trim() const message = (await input.question(`请输入提交信息 (${defaultMessage}): `)).trim()
|| defaultMessage; || defaultMessage;
// --only 再次限制提交范围,确保 Java 仓库其他路径不会进入本次提交。
// Git 认证和提交作者均由本机 Git 配置提供,工具本身不保存凭据或写死 author。 // Git 认证和提交作者均由本机 Git 配置提供,工具本身不保存凭据或写死 author。
run('git', ['commit', '-m', message, '--no-verify'], javaRepository); run('git', [
'commit',
'-m',
message,
'--no-verify',
'--only',
'--',
...javaTargetPaths,
], javaRepository);
run('git', ['push'], javaRepository); run('git', ['push'], javaRepository);
console.log('代码推送完成。'); console.log('代码推送完成。');
} finally { } finally {
@ -225,3 +250,4 @@ async function pushJava({ environment: environmentArgument } = {}) {
module.exports = pushJava; module.exports = pushJava;
module.exports.resolveBuildScript = resolveBuildScript; module.exports.resolveBuildScript = resolveBuildScript;
module.exports.getJavaTargetPaths = getJavaTargetPaths;

View File

@ -1,5 +1,5 @@
const assert = require('assert'); const assert = require('assert');
const { resolveBuildScript } = require('../src/push'); const { getJavaTargetPaths, resolveBuildScript } = require('../src/push');
const buildScripts = ['build', 'build:development', 'build:production']; const buildScripts = ['build', 'build:development', 'build:production'];
@ -9,3 +9,8 @@ assert.throws(
() => resolveBuildScript(buildScripts, 'test'), () => resolveBuildScript(buildScripts, 'test'),
/package.json 中没有构建脚本 build:test/ /package.json 中没有构建脚本 build:test/
); );
assert.deepStrictEqual(getJavaTargetPaths('basicInfo'), [
'start/src/main/resources/templates/basicInfo',
'start/src/main/resources/templates/basicInfo.html',
]);