插件任务:

在用户执行rebar3 compile时,自动运行插件自定义的逻辑。

增加钩子:

在顶层目录的rebar3.config中增加配置(provider hooks的写法)

{provider_hooks, [       {pre, [{compile, {auto_config, compile}}]}
]}.

意为 rebar3 compile命令前,自动执行 rebar3 auto_config compile 指令

或者 shell hooks 的写法:
{pre_hooks, [“win32”, compile, “rebar3 auto_config compile”]}

新建插件文件:

在新建插件的目录下执行:
rebar3 new plugin 插件名字
输出为:

===> Writing rebar3_auto_config_plugin/src/rebar3_auto_config_plugin.erl
===> Writing rebar3_auto_config_plugin/src/rebar3_auto_config_plugin_prv.erl
===> Writing rebar3_auto_config_plugin/src/rebar3_auto_config_plugin.app.src
===> Writing rebar3_auto_config_plugin/rebar.config
===> Writing rebar3_auto_config_plugin/.gitignore
===> Writing rebar3_auto_config_plugin/LICENSE
===> Writing rebar3_auto_config_plugin/README.md

_prv文件简介:

文件中有三个回调需要我们实现:

  • init(State) - {ok, NewState},进行插件设置。
  • do(State) - {ok, NewState} | {error, Error},执行实际的工作。
  • format_error(Error) - 错误发生时打印错误。

插件设置的内容有:

  • name:任务的名称。 module:任务的实现模块。
  • bare:用户是否可以运行任务。应该设置为true。
  • deps:依赖项列表,不需要包含依赖项的依赖项。[dep | {namespace, dep}]
  • desc:任务描述,rebar3帮助使用
  • short_desc:任务的一行简短描述
  • example:任务用法示例,例如“rebar3 my-provider args”
  • opts:执行任务的选项列表。形式为 {Key, $Character, ‘StringName’, Spec, HelpText},其中:
    • Key 是一个原子,用于通过
      {Args, _} = rebar_state:command_parsed_args(State)
      Arg = proplists:get_value(Key, Args)
      获取选项值;
    • $Character 是选项的缩写形式。如果命令要作为 -c Arg 输入,则Character 应该为 c
    • Spec 可以是类型(atom、binary、boolean、float、integer或string)、默认的类型({Type、Val})或 undefined。
  • profiles:配置文件。默认为 [default]。
  • namespace:注册命名空间。默认为 default。

添加命名空间:

在 rebar3_auto_config_plugin_prv 文件 init函数中,增加namespace的定义,修改后代码如下:

Provider = providers:create([             {name, ?PROVIDER},                        {namespace, auto_config},   ......

命名空间的作用是避免?PROVIDER和别的插件或默认命令冲突。
插件的 ?PROVIDER 定义为 compile, 那么当用户执行 rebar3 compile xxx 的时候, rebar3是执行默认的compile指令呢还是插件的指令? 为了区分这种尴尬的情况,namespace字段就排上用场了。现在我们执行 rebar3 auto_config compile XXX, rebar3就知道需要运行的是aoto_config插件指令。

DEPS的宏需要改为

-define(DEPS, [{default, app_discovery}]).

因为我们当前模块定义了新的命名空间,要使用app_discovery的话,需要指明其来源的命名空间。
如果我们没有定义新的命名空间,那么使用默认的宏定义即可。

获取执行插件的app:

-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
do(State) ->     Apps = case rebar_state:current_app(State) of   undefined -> rebar_state:project_apps(State);                   AppInfo -> [AppInfo]            end,     [do_some_thing(AppInfo) || AppInfo <- Apps],     {ok, State}.

在 do_some_thing 中实现插件的功能即可。

rebar3 自定义编译插件攻略相关推荐

  1. 绝地求生自定义服务器租一天多少钱,绝地求生自定义服务器怎么样?绝地求生自定义服务器使用攻略...

    绝地求生自定义服务器怎么样?绝地求生自定义服务器使用攻略,我们一起看看吧.据悉,绝地求生将开放绝地求生自定义服务器,关于这个问题,我们一起看看绝地求生自定义服务器具体使用攻略,希望能帮到你啦. 绝地求 ...

  2. 我的世界服务器背景音乐修改,我的世界怎么自定义背景音乐教程攻略

    我的世界怎么自定义游戏背景音乐,今天小编为大家带来的是我的世界修改背景音乐教程,喜欢的小伙伴不妨看看我的世界怎么修改背景音攻略,希望大家喜欢. 那么我的世界音乐文件夹在哪呢?先打开游戏的根目录,再打开 ...

  3. 我的世界服务器自定义怪物怎么用,我的世界完全自定义怪物教程攻略

    这个是由玩家crazycaoke制作分享的我的世界的完全自定义怪物的教程,列出了各种怪物出现的命令配合视频易于理解,有兴趣的玩家可以来看看. 命令: 随机骷髅:/summon Skeleton ~ ~ ...

  4. Python IDE之Pydev: 基于Eclipse搭建python的编译环境(Eclipse+pydev)简介、安装、使用的详细攻略

    Python IDE之Pydev: 基于Eclipse搭建python的编译环境(Eclipse+pydev)简介.安装.使用的详细攻略 目录 pydev简介 PyDev 安装和配置 1.安装MyEc ...

  5. 【“互联网+”大赛华为云赛道】CloudIDE命题攻略:明确业务场景,快速开发插件

    摘要:基于华为云CloudIDE和插件开发框架自行设计并开发插件. IDE是每个开发人员必备的生产工具,一款好的IDE + 插件的组合,除了帮助开发者把编写代码.组织项目.编译运行放在一个环境中外,还 ...

  6. ambari全攻略流程,编译ambari(三)

    ambari的编译 此次编译用VM14虚拟机安装Centos7系统进行编译,其中作者发现有docker脚本虽然可以添加镜像编译环境但是操作较复杂问题多变所以没能完整编译代码,退而求其次在虚拟机上搭建了 ...

  7. QQ光遇攻略机器人插件光萌插件『LightCute』来啦!内容自制,独家小精灵问答功能!!

    此插件由@小叮当 制作,UI视觉设计@kindyear,@光萌攻略组 为内容提供者, @柒彦 为内容管理者,使用插件完全无需担心图片授权/版权问题,因为内容纯自制. 插件所有攻略内容源于[光萌攻略组] ...

  8. 【干货】Chrome插件(扩展)开发全攻略-转载

    [干货]Chrome插件(扩展)开发全攻略 写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这 ...

  9. 新手入门Chrome插件(扩展)开发全攻略

    [干货]Chrome插件(扩展)开发全攻略 写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这 ...

最新文章

  1. msbuild 语法_用于删除文件的MSBuild Task语法
  2. 等概率随机函数的实现
  3. 小程序的前端坑(持续更新)
  4. 【暖*墟】#逆矩阵# 矩阵求逆的思路与方法
  5. C#中一道关于多线程的基础练习题——模拟仓库存销过程
  6. High Logic MainType 10中文版
  7. android图片浏览远近,快图浏览编辑图片方法介绍_怎么编辑图片_3DM手游
  8. 由已打开的文件读取数据---read
  9. 几个你可能不了解的CSS单位
  10. Python网络爬虫第一弹《Python网络爬虫相关基础概念》
  11. ensp配置access口_华为路由交换技术 | 虚拟局域网VLAN详解与配置
  12. Clickhouse 实现row_number、dense_rank
  13. 最新PP点点通V2008简体中文版免费下载
  14. 玻纤效应差分信号影响及处理方法,使用sigrity建模玻纤效应仿真
  15. Linux 内核下载地址
  16. PID控制算法原理学习
  17. 使用python将windows下多种文件格式转换成PDF格式
  18. AutoCAD中如何截取清楚的图像
  19. 必不可少的10类MAC装机必备软件,个个万里挑一
  20. Any Takers For AIG's Asian Arm?

热门文章

  1. 动力节点Dubbo学习笔记
  2. Kubernetes是什么?
  3. 20144306《网络对抗》CAL_MSF基础运用
  4. Python单元测试、Python文档测试
  5. 绿色物流-智慧仓储监控管理 3D 可视化系统
  6. 资本家为什么要破坏资本主义?
  7. 中南大学计算机学硕很难考吗,2019中南大学计算机专业考研成功经验分享
  8. 十种距离计算公式及Python简单实践(余弦距离、欧式距离、jaccard距离等)
  9. 尺寸压缩与质量压缩的文件大小及效果对比,webp格式
  10. 第二十章 使用系统监视器 - 定义系统监视器组件