ember-cli-release, 支持版本化发布管理的Ember CLI插件

分享于 

16分钟阅读

GitHub

  繁體 雙語
Ember CLI addon for versioned release management
  • 源代码名称:ember-cli-release
  • 源代码网址:http://www.github.com/shipshapecode/ember-cli-release
  • ember-cli-release源代码文档
  • ember-cli-release源代码下载
  • Git URL:
    git://www.github.com/shipshapecode/ember-cli-release.git
    Git Clone代码到本地:
    git clone http://www.github.com/shipshapecode/ember-cli-release
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/shipshapecode/ember-cli-release
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    ember-cli-release

    Build StatusNPM VersionEmber Observer Score

    定义 release 命令以使应用程序或者插件的版本崩溃的Ember插件。 它是与 npm version 命令 streamlined的一种简化方案,具有许多其他优点:

    • 非semver标记策略
    • 配置文件的配置文件:
      • 自定义默认值
      • 承诺友好的钩子
    • bower.json 版本替换
    • 带注释的标签支持

    Introduction to ember-cli-release at Global Ember Meetup

    安装

    $ ember install ember-cli-release

    这还将生成配置文件 config/release.js,它可以用于提供默认选项( 见下面。)。

    用法

    这个插件围绕着git标签,因此很依赖于shelling运行git命令( 与美妙的git-repo-info 不同。)。

    在没有选项的情况下调用:

    $ ember release

    它将:

    • 假定项目使用的是 SemVer的版本控制方案
    • 找到SemVer兼容的最新标签,并增加它的补丁版本
    • package.jsonbower.jsonversion 属性替换为新版本
    • 提交对工作目录树的所有更改
    • 使用新版本创建一个轻量级的git标签
    • 将分支和新标签推送到 origin

    有关使用命令的更多方法,请参见示例

    命令行选项

    选项可以在 命令行 或者 config/release.js 上指定,除非用 Asterisk ( * ) 标记。 在 命令行 指定的选项总是优先于配置文件中的选项。 运行 ember help 以查看CLI别名。

    • local

      默认值:false

      是否只在本地创建git标记。

    • remote

      默认值:'origin'

      将新标签推送到的git remote,如果 local 是 true 则忽略。

    • tag *

      默认值:null

      要创建的标记的可选 NAME,替代版本控制策略。

    • annotation

      默认值:null

      当创建标签时添加的消息,指示标记应该被注释为,其中 %@ 被标记名称替换。

    • message

      默认值:'Released %@'

      当将更改提交到工作树( 包括对 package.jsonbower.json的更改) 时使用的消息,其中 %@ 被标记名替换。

    • manifest

      默认值: [ 'package.json', 'bower.json' ]

      一组JSON清单文件,用于将顶级 version 键替换为新的标记名。

    • publish

      默认值:false

      标记后是否将软件包发布到 NPM。 使用当前登录的NPM用户和注册中心中定义的注册表( 如项目中所定义的那样)。

    • yes *

      默认值:false

      是否跳过确认提示或者( 接听'是'所有问题)。

    • strategy

      默认值:'semver'

      使用 semver 或者 date的版本策略。

    • major *

      默认值:false

      增加主要 SemVer版本,优先于 minor。 仅在 strategy 选项为 'semver' 时使用。

    • minor *

      默认值:false

      如果两个 majorminor 都是 false,则增加 minor version版本,patch incremented。 仅在 strategy 选项为 'semver' 时使用。

    • premajor *

      默认值:''

      增加主要 SemVer版本,并添加带有 0 版本的给定预发布标识符。 仅在 strategy 选项为 'semver' 时使用,如果指定了 major 或者 minor,则忽略。

    • preminor *

      默认值:''

      增加次要 SemVer版本,并添加带有 0 版本的给定预发布标识符。 仅在 strategy 选项为 'semver' 时使用,如果指定了 majorminor 或者 premajor,则仅使用。

    • prerelease *

      默认值:false

      使用SemVer时,有多种行为:

      • 最新版本包含预发布标识符
        • 如果省略了值或者 MATCHES的当前标识符,则增加预发布版本。
        • 如果值与当前标识符不同,请将标识符更改为给定的标识符,并将预发布版本重置为 0
      • 最新版本不包含预发布标识符
        • 增加补丁版本并附加给定的预发行标识符( 该值必须是字符串)。

      仅在 strategy 选项为 'semver' 时使用,如果指定了 majorminorpremajor 或者 preminor,则仅使用。

    • format

      默认值:'YYYY.MM.DD'

      当使用 moment().format() 基于当前日期创建标记时使用的格式字符串。 仅在 strategy 选项为 'date' 时使用。

    • timezone

      默认值:'UTC'

      要考虑当前日期的时区。 仅在 strategy 选项为 'date' 时使用。

    钩子

    生命周期钩子集作为一种手段,在发布过程中注入额外行为。 生命周期钩子可以在 config/release.js 中指定。 所有钩子都可以返回一个 thenable,在继续发布过程之前将被解析。 从钩子中抛出或者拒绝钩子返回的承诺将停止释放进程并打印错误。

    钩子被传递两个参数:

    • project - 对当前 ember-cli项目的引用
    • tags - 包含标记信息的对象,它将始终具有 next 属性,并且根据你正在使用的策略,可能还具有 latest 属性。 注意,这些值将是用于标记的确切值,默认情况下,这些值包括一个 v 前缀。

    有三个生命周期钩子可用:

    • init

      在计算新版本之后,但在对 文件系统 或者存储库进行任何更改之前调用。 如果需要验证本地环境是否为释放,则使用这里钩子,如果没有,则中止。

      示例用法

      中止:

      // config/release.jsmodule.exports= {
       init:function() {
       if (!process.env.SUPER_SECRET_KEY) {
       throw'Super secret key missing!';
       }
       }
      };
    • beforeCommit

      在清单文件中替换新版本之后,在提交更改之前调用。 如果需要更新其他文件中的版本号,或者生成项目以更新dist文件,请使用这里钩子。 注意,无论是否提交提交,这个钩子都会运行。

      示例用法

      版本替换:

      // config/release.jsvar path =require('path');var xmlpoke =require('xmlpoke');module.exports= {
       beforeCommit:function(project, tags) {
       xmlpoke(path.join(project.root, 'cordova/config.xml'), function(xml) {
       xml.errorOnNoMatches();
       xml.addNamespace('w', 'http://www.w3.org/ns/widgets');
       xml.set('w:widget/@version', tags.next);
       });
       }
      };

      建筑物:

      // config/release.jsvar BuildTask =require('ember-cli/lib/tasks/build');module.exports= {
       // Build the project in the production environment, outputting to dist/beforeCommit:function(project) {
       var task =newBuildTask({
       project: project,
       ui:project.ui,
       analytics:project.cli.analytics });
       returntask.run({
       environment:'production',
       outputPath:'dist/' });
       }
      };
    • afterPush

      在成功将所有更改推送到指定的远程,但在退出之前调用。 在发布任务中使用这个钩子,比如清除或者发送来自你的CI服务器的通知。

      示例用法

      通知:

      // config/release.jsvar Slack =require('node-slack');// Look for slack configuration in the CI environmentvar isCI =process.env.CI;var hookURL =process.env.SLACK_HOOK_URL;module.exports= {
       // Notify the #dev channel when a new release is createdafterPush:function(project, tags) {
       if (isCI && hookURL) {
       var slack =newSlack(hookURL);
       returnslack.send({
       text:'ZOMG, '+project.name() +''+tags.next+' RELEASED!!1!',
       channel:'#dev',
       username:'Mr. CI' });
       }
       }
      };
    • afterPublish

      在将包成功发布到NPM之后调用,但在退出之前调用。 在执行发布时使用与 afterPush 完全一样的钩子。 注意,当 --publish 选项未设置时,这个钩子没有运行。

    自定义标记策略

    如果应用程序不使用in或者基于日期的标记,则可以通过使 strategy 属性在 config/release.js 中生成下一个标记。 函数接受三个参数: 项目实例,现有git标记的array,以及带有所有选项值的选项散列。 它必须返回一个指定下一个标记的非空 字符串,或者一个用标记 NAME 解析的诺。 例如:

    // config/release.jsmodule.exports= {
     // Emulate Subversion-style build numbersstrategy:function(project, tags, options) {
     var builds = tags
    . map(function(tag) { return+tag; })
    . filter(function(build) { return!isNaN(build); })
    . sort()
    . reverse();
     return builds[0] +1;
     }
    };

    如果自定义策略需要附加的CLI选项,则可以使用 availableOptionsgetLatestTaggetNextTag 属性指定对象:

    // config/release.jsmodule.exports= {
     strategy: {
     availableOptions: [
     {
     name:'channel',
     type:String,
     default:'stable',
     description:"the release's channel" },
     ],
     getLatestTag:function(project, tags, options) {
     // Find the latest tag in the `tags` arrayvar latest ='...';
     return latest;
     },
     getNextTag:function(project, tags, options) {
     // Generate an identifiervar next ='...';
     // Prepend the specified channelreturnoptions.channel+'-'+ next;
     }
     }
    };

    工作流

    以下是运行 release 命令时发生的步骤:

    • 如果HEAD已经在标记中,则中止
    • 如果 publish 选项是 true 并且没有登录用户,或者 strategy 不是'semver,则中止'
    • 计算新版本
    • 如果存在,请使用 tag 选项
    • 如果指定了自定义标记策略,则调用
    • 否则,使用 strategy 选项生成新版本( 默认: '')
    • SemVer
    • 使用 node-semver 命令查找最新标签
    • 基于 majorminor 或者 patch的增量( 默认值: patch )
    • 日期
    • 根据当前日期和 format 选项创建标记 NAME ( 默认: YYYY.MM.DD )
    • 查找相同 NAME的现有标记,在其中追加 .X 为递增整数
    • 打印新版本名称
    • 调用 init 钩子
    • 如果工作树脏,提示用户将它的更改包括在发布提交中
    • 替换由 manifest 选项指定的文件的version 属性( 默认: package.json/bower.json )
    • 调用 beforeCommit 钩子
    • 提交更改
    • 如果未修改工作树,跳过
    • 执行所有更改并使用 message 选项提交提交消息
    • 创建标签
    • 提示继续新的标记名称
    • 如果指定了 annotation 选项,则使用选项将最新提交标记为
    • 推送到远程
    • 如果 local 选项为 true ( 默认为: false )
    • 将当前分支和标签推送到 remote 选项指定的远程
    • 调用 afterPush 钩子
    • 如果 publish 选项是 true,则使用当前凭据将软件包发布到 NPM ( 默认为: false )
    • 调用 afterPublish 钩子

    示例

    要使用自定义格式根据east成本时间中的日期创建新标签,请执行以下操作:

    > ember release --strategy=date --format="YYYY-MM-DD" --timezone="America/New_York"

    或者在本地创建带有注释的特定标记( 无版本控制策略),仅在本地:

    > ember release --local --tag="what_am_i_doing" --annotation="First version wooooo!"

    要创建一系列 SemVer prereleases,请使用 --premajor ( 或者 --preminor ) 选项,然后使用任意数量的--prerelease,最后是 --major ( 或者 --minor ):

    # v1.3.2> ember release --premajor alpha# v2.0.0-alpha.0> ember release --prerelease# v2.0.0-alpha.1> ember release --prerelease beta# v2.0.0-beta.0> ember release --prerelease# v2.0.0-beta.1> ember release --major# v2.0.0

    拉请求欢迎,但必须完全测试( 并通过所有现有测试) 来考虑。 讨论问题也欢迎。

    运行测试

    $ npm test

    MAN  添加  版本  REL  ember  Ember Cli  
    相关文章