通过npm节点

时间:2016-07-19 13:27:47

标签: node.js git npm gulp

我一直试图得到的是,使用npm版本来更新package.json并创建一个标记,然后提交我的更改。通过这种方式,我将能够按版本,自动版本控制和提交信息。

我遇到的问题是,当我使用npm版本时,它会自动执行标记+提交然后如果你之前有一些更改就无法完成,所以对我来说,它并没有&#39 ;在进行更改/实施/修复之前,有意义地增加项目的版本。

然后,我遇到的另一个问题是我首先将版本增加为'补丁,然后我做了一些更改,我添加了所有内容,我提交然后发布,最后,我有2个提交,1个是因为npm版补丁,另一个是好的。

我在文档here中看到有一个参数允许你禁用这个自动标记+提交,但是我真的想在控制台中使用一个命令来更新包控制台并将该版本设置为标记。

另一方面,不确定这是否说我确实有意义,因为据我所知,当你创建一个标签时,你可以回到你的项目到那一点,所以我假装工作像如果我禁用自动提交?

  

最后,我想说清楚的是我的目标,我真正希望达到的是通过节点脚本处理一个半自动脚本才能够   要增加项目的版本,请使用new创建标记   版本,添加所有更改,提交和推送。

注意:我不想使用gulp-git,因为我认为有一种方法可以在没有它的情况下处理它。

不确定如果我足够清楚,如果没有,请询​​问并帮助我:)

2 个答案:

答案 0 :(得分:1)

好的,伙计们,我明白了!我正在寻找的是运行一个简单的命令并自动执行一些无聊的任务,我们必须按照Git的相同顺序执行这些任务。

所以,我在这里做的是,首先我运行这个命令:

const std::remove_pointer_t<T>*

它发生的是我首先清理文件夹/文件而我不需要/想要,然后我运行:

$> npm run commit -- 'v.1.0.1: Fixes'

该命令增加了我的package.json版本,而不是提交&amp;不标记,所以然后我正常添加所有更改,然后我提交我的更改,然后,我创建标签:commit gulp task。

在gulp任务中(附后),我将获得带有require的包的版本并将其视为对象。

$> npm version patch -no-git-tag-version --force

然后,我在我的gulp文件中有这个:

"scripts": {
   "start": "gulp start",
   "initialize": "npm install & typings install",
   "clean": "gulp clean:folders",
   "commit:example": "echo 'npm run commit -- 'v.1.0.1: Fixes'",
   "commit:patch": "npm version patch --no-git-tag-version --force",
   "commit:minor": "npm version minor --no-git-tag-version --force",
   "commit:major": "npm version major --no-git-tag-version --force",
   "precommit": "npm run clean && npm run commit:patch && git add --all",
   "postcommit": "gulp tag:commit && git push origin master && git status && gulp commit:done",
   "commit": "git commit -m "
},

我不想使用gulp-git,因为我知道有办法做到这一点,如果我需要合并,创建早午餐或其他什么,我将运行控制台并修复它,但对于每日提交,它是记住标记,更新软件包版本,将其放入git commit ....

是很痛苦的

我希望这对其他人有用!

干杯,

答案 1 :(得分:0)

仅将一个名为commit的npm脚本添加到package.json中:

"scripts": {
    ...
    "commit": "node commit"
    ...
},

使用方式如下:

$> npm run commit patch "Your commit message goes here"

patch可以替换为minormajor的位置,具体取决于您想要/需要的版本。

./commit.js脚本内容如下:

#!/usr/bin/env node
'use strict';

const util = require('util');
const exec = util.promisify(require('child_process').exec);
const spawn = require('child_process').spawnSync;

async function version(versionType) {
    const { stdout, stderr } = await exec(`npm version ${versionType} --no-git-tag-version --force`);
    if (stderr) throw stderr;
    return stdout;
}

async function branch() {
  const { stdout, stderr } = await exec(`git rev-parse --abbrev-ref HEAD`);
  if (stderr) throw stderr;
  return stdout;
}

const run = async () => {
  try {
    const versionType = process.argv[2];
    const gitMessage = process.argv[3];

    if (versionType !== 'patch' && versionType !== 'minor' && versionType !== 'major') throw new Error('You need to specify npm version! [patch|minor|major]');
    if (!gitMessage) throw new Error('You need to provide a git commit message!');

    const npmVersion = await version(versionType);
    await spawn('git', ['add', 'package.json', 'package-lock.json'], { stdio: 'inherit' });
    await spawn('git', ['commit', '-m', gitMessage.trim()], { stdio: 'inherit' });
    await spawn('git', ['tag', npmVersion.trim()], { stdio: 'inherit' });
    await spawn('git', ['status'], { stdio: 'inherit' });
    const currentBranch = await branch();
    await spawn('git', ['push', 'origin', currentBranch.trim()], { stdio: 'inherit' });

  } catch (err) {
    console.log('Something went wrong:');
    console.error(err.message);
    console.error('\nPlease use this format: \nnpm run commit [patch|minor|major] "Commit message"');
  }
};

run();

请注意,我没有添加git add --all,因为我希望对提交的内容更具选择性,但是此脚本的格式应该足够容易,任何人都可以使用和扩展。 do,我确实有git add package.json,所以此脚本的每次执行都会颠倒package.json / package-lock.json的版本,并至少提交这些文件。我的策略是在执行上面提到的命令之前先执行git add

这里要考虑的另一件事是,该脚本与husky hooks(特别是pre-commit)完全兼容,在我看来,该脚本驱动lint-staged耦合到eslint和{{1} }。这样,一切都可以很好地实现自动化,苗条和标准化。

我希望这对某人有帮助,干杯!