Git Product home page Git Product logo

lean-cli's Introduction

lean(1)

Build Status GoDoc

Command-line tool to develop and manage LeanCloud and TapTap Developer Services apps.

Install

lean-cli will send statistics information such as your os version and lean-cli version to Google Analytics. This statistics information helps us to improve LeanEngine services. To opt out, you can set the environment variable NO_ANALYTICS to true.

Develop

Install the toolchains:

You can install them via homebrew

Clone this repo then run make all to build releases.

Please run go mod tidy and go mod vendor to make vendored copy of dependencies after importing new dependencies.

Ensure all codes is formatted by gofmt. Commit message should write in gitmoji.

Command-line interface design following docopt.

Release

Tag the current commit with version name, and create a release with this tag. run $ make all and attach the build result (under ./_build folder) to the release.

The homebrew guys will update the home brew formula. If not, or we are in a hurry, just make a pull request to them.

Releases will fetch from GitHub automatically. If not, or we are in a hurry, just execute cloud function updateRepo with argument {"repo": "leancloud/lean-cli"} to update.

lean-cli's People

Contributors

0xflotus avatar aisk avatar binaryhb0916 avatar cshuaimin avatar dlmyb avatar feisuzhu avatar godblesshugh avatar hjiang avatar jysperm avatar kylinbin avatar leeyeh avatar onerain88 avatar qiuyi116 avatar sdjcw avatar soasurs avatar the-alchemist avatar weakish avatar yelmor avatar ym avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lean-cli's Issues

增加统计功能

在 ${HOME}/.leancloud/config.json 中有

{
  "send_statistics": true,
  "trace_id": "uuid-string"
}

的选项可以控制是否开启。首次安装完成之后默认开启(通过检测这个文件是否存在来判断是否首次安装),并且给出提示可修改此文件来关闭统计。

由于一些命令执行速度比较快,命令启动时需要 fork 一个子进程来发送统计信息。(或者考虑使用本地缓存,等到运行长期执行的命令时再和服务器同步?)

目前只统计用户执行子命令使用的情况,以及本地调试时项目的类型,以及命令行崩溃后产生的 log。不会纪录任何隐私相关信息。

lean-deploy 子命令

部署应用到 LeanEngine。
--stg / --stage 部署到 stage 环境,--prod / --production 部署到 production 环境。

最后一条日志是成功的话,部署就应该算是成功的

jysperm@jysperm-MacBook ~/j/leancloud-restful> lean deploy
> 获取应用信息 [SUCCESS]
> 准备部署至目标应用:LeanCloud Restful (zyC5kGNzjHr74WyTT8pr6pYw-gzGzoHsz)
> 获取应用分组信息 [SUCCESS]
> 准备部署应用到生产环境: web
> 检测到 node.js 运行时
> 压缩项目文件 ... [SUCCESS]
> 上传应用文件 2.06 MB / 2.06 MB [========================================] 100.00% 4s
> 开始构建 20161101-121447 [SUCCESS]
> 正在下载应用代码 ... [SUCCESS]
> 正在解压缩应用代码 ... [SUCCESS]
> [Node.js] 未在 `package.json` 中指定 `engines.node`,将默认使用 Node.js 0.12 [SUCCESS]
> 运行环境: nodejs (leanengine/nodejs-base) [SUCCESS]
> 正在下载和安装依赖项 ... [SUCCESS]
> 存储镜像到仓库(18.14MB)... [SUCCESS]
> 镜像构建完成:20161101-121447 [SUCCESS]
> [Node.js] 使用 Node.js v0.12.16 [SUCCESS]
> 开始部署 20161101-121447 到 web1 [SUCCESS]
> 正在创建新实例 ... [SUCCESS]
> 正在启动新实例 ... [SUCCESS]
> 实例启动成功:LeanCloud Restful [SUCCESS]
> 正在统一切换新旧实例 ... [SUCCESS]
> 正在更新云函数信息 ... [SUCCESS]
> 云函数信息接口返回 404,已忽略云函数和 Hook [SUCCESS]
> 部署完成:1 个实例部署成功 [SUCCESS]
> 删除临时文件 [SUCCESS]
部署失败

有的时候部署过程中会有 error 级别的警告,但只要最后一条日志是成功,整个部署就是成功的

支持日志导出

支持日志导出,并且最好能支持多种格式(plain text / JSON)

  • 云引擎控制台日志导出
  • 云引擎 access log 导出
  • 存储服务 access log 导出

新版命令行工具改进用户调试 Class Hook 的体验

本地调试时,当用户的代码保存了一个对象时,会调用线上的云存储 API,触发的是线上的的 afterSave(而不是本地的),我们有没有办法能够自动触发一次本地的 afterSave,同时不触发线上的 afterSave?

这个功能需要各 SDK 的支持,当有某个环境变量时,发出的云存储请求自动 disableAfterHook( https://leancloud.cn/docs/leanengine_cloudfunction_guide-php.html#防止死循环调用 ),同时自动触发一次本地的 afterSave,这两个操作都需要用 masterKey。

另外如果用户在本地启动的 Node / Python 程序的前端部分使用 JS SDK 来修改对象,我们是否有办法触发本地的 afterSave?

使用 ssl 隧道访问内网服务

一些内网服务可能会允许用户连接上去:

  • rsync: 用户部署时上传代码
  • redis: 提供原生 redis-cli 提供给用户使用 (redis-cli 在服务器上运行)

需要服务端支持:

  • 提供 API,并且帮用户生成 ssh key (可以复用现有 git 部署的 ssh key) ,用户可以使用 master key 换取私钥。
  • 具体的 rsync / redis-cli 服务,需要考虑安全与隔离问题。

命令行部署时自动为版本添加可读的备注

之前所有从命令行部署的版本的备注都是「从命令行工具构建」,很难区分,构建相关的接口都是有一个 comment 参数的,可以设置自定义的备注,可以展示在网页控制台上。

我的建议是这样,如果当前目录是一个 Git 仓库的话,用当前的 Commit Message 作为备注。如果 Git 工作区是干净的(从上一个 Commit 以来没有修改过)就直接用 Commit Message,例如「Add some file」,如果已经改过文件就加个 WIP 的前缀:「WIP: Add some file」。

支持 env / unset 子命令

用来设置线上环境变量:

列出环境变量:

$ lean env
FOO=foo
BAR=bar

修改/添加环境变量:

$ lean env export BAZ=baz

删除环境变量:

$ lean unset FOO

另外支持 --prod 参数指定生产环节/预备环境。

支持 Python virtualenv 相关功能

希望能集成 Python 的 virtualenv:

  • init 之后就在当前目录下创建一个 virtualenv 的目录,在此文件夹下创建一个 virtualenv 环境(如果机器上安装了 virtualenv 的话)。
  • up 时检测当前目录下是否有 virtualenv 目录,有的话自动使用此 virtualenv 启动项目。
  • 增加子命令 pip-install,在 virtualenv 下安装 requirements.txt 中的依赖。

包管理支持(以及更新检查)

  • 更新检查

计划支持的包管理:

  • go get
  • homebrew 暂时创建一个 LeanCloud 的 Formula,后续尝试提交给 Homebrew
  • AUR
  • PPA 支持了 .deb,暂时先不支持了
  • deb
  • binary 直接提供二进制文件供用户下载
  • msi 供 windows 用户点击安装

构建不同的包管理支持时,需要编译时指定当前二进制构件方式,自动检查更新时提示用户使用相应的方法进行更新。

使用 LeanCloud 账号密码登录

Node.js 部分的代码,仅供参考:

var login = exports.login = function(cb) {
  var email, password, uluru_user;
  async.waterfall([
  ¦ function(cb) {
  ¦ ¦ promptly.prompt('邮箱:', cb);
  ¦ }, function(data, cb) {
  ¦ ¦ email = data;
  ¦ ¦ promptly.password('密码:(输入不可见)', cb);
  ¦ }, function(data, cb) {
  ¦ ¦ password = data;
  ¦ ¦ request({
  ¦ ¦ ¦ url: 'https://leancloud.cn/1/signin',
  ¦ ¦ ¦ method: 'POST',
  ¦ ¦ ¦ headers: {
  ¦ ¦ ¦ ¦ 'User-Agent': 'AVOS Cloud Command Line/' + version
  ¦ ¦ ¦ },
  ¦ ¦ ¦ json: {
  ¦ ¦ ¦ ¦ email: email,
  ¦ ¦ ¦ ¦ password: password
  ¦ ¦ ¦ }
  ¦ ¦ }, cb);
  ¦ }, function(res, body, cb) {
  ¦ ¦ if(res.statusCode != 200) {
  ¦ ¦ ¦ return cb(new Error('登录失败:' + body.error));
  ¦ ¦ }
  ¦ ¦ res.headers['set-cookie'].forEach(function(c) {
  ¦ ¦ ¦ c = cookie.parse(c);
  ¦ ¦ ¦ if(c.uluru_user) {
  ¦ ¦ ¦ ¦ uluru_user = c.uluru_user;
  ¦ ¦ ¦ ¦ saveTokenSync(uluru_user);
  ¦ ¦ ¦ }
  ¦ ¦ });
  ¦ ¦ cb(null);
  ¦ }
  ], cb);
};

exports.getUsername = function(cb) {
  getToken(function(err, uluru_user) {
  ¦ request({
  ¦ ¦ url: 'https://leancloud.cn/1/clients/self',
  ¦ ¦ headers: {
  ¦ ¦ ¦ 'Cookie': 'uluru_user=' + encodeURIComponent(uluru_user),
  ¦ ¦ ¦ 'User-Agent': 'AVOS Cloud Command Line/' + version,
  ¦ ¦ ¦ 'Content-Type': 'application/json;charset=utf-8'
  ¦ ¦ },
  ¦ }, function(err, res, body) {
  ¦ ¦ body = JSON.parse(body);
  ¦ ¦ if(res.statusCode != 200) {
  ¦ ¦ ¦ return cb(new Error('获取登录用户信息失败:' + body.error + '\n请重新登录'));
  ¦ ¦ }
  ¦ ¦ cb(null, body.username);
  ¦ });
  });
};

var saveTokenSync = function(token) {
  var configDir = path.join(getUserHome(), ".avoscloud");
  if (!fs.existsSync(configDir)) {
  ¦ fs.mkdirSync(configDir);
  }
  fs.writeFileSync(path.join(configDir, 'sessionToken'), token);
};

var getAllApps = function(cb) {
  getToken(function(err, uluru_user) {
  ¦ request({
  ¦ ¦ url: 'https://leancloud.cn/1/clients/self/apps',
  ¦ ¦ headers: {
  ¦ ¦ ¦ 'Cookie': 'uluru_user=' + encodeURIComponent(uluru_user),
  ¦ ¦ ¦ 'User-Agent': 'AVOS Cloud Command Line/' + version,
  ¦ ¦ ¦ 'Content-Type': 'application/json;charset=utf-8'
  ¦ ¦ },
  ¦ }, function(err, res, body) {
  ¦ ¦ body = JSON.parse(body);
  ¦ ¦ if(res.statusCode != 200) {
  ¦ ¦ ¦ return cb(new Error('获取应用列表失败:' + body.error));
  ¦ ¦ }
  ¦ ¦ var result = _.map(body, function(app) {
  ¦ ¦ ¦ return {
  ¦ ¦ ¦ ¦ app_name: app.app_name,
  ¦ ¦ ¦ ¦ app_id: app.app_id,
  ¦ ¦ ¦ ¦ app_key: app.app_key,
  ¦ ¦ ¦ ¦ master_key: app.master_key
  ¦ ¦ ¦ };
  ¦ ¦ });
  ¦ ¦ cb(null, result);
  ¦ });
  });
};

exports.createNewProject = function(cb) {
  var allApps, app, tmpFile;
  var urls = [
  ¦ 'http://lcinternal-cloud-code-update.avosapps.com/node-js-getting-started.zip',
  ¦ 'http://lcinternal-cloud-code-update.avosapps.com/python-getting-started.zip'
  ];
  async.waterfall([
  ¦ function(cb) {
  ¦ ¦ getAllApps(cb);
  ¦ }, function(data, cb) {
  ¦ ¦ allApps = data;
  ¦ ¦ var info = _.reduce(allApps, function(result, app, index) {
  ¦ ¦ ¦ return result + '  ' + index + ': ' + app.app_name + '\n';
  ¦ ¦ }, '应用列表:\n');
  ¦ ¦ console.log(info);
  ¦ ¦ promptly.prompt('输入序号:', {
  ¦ ¦ ¦ validator: function(v) {
  ¦ ¦ ¦ ¦ if(allApps[v] === undefined) {
  ¦ ¦ ¦ ¦ ¦ throw new Error('序号必须为 0~' + (allApps.length - 1));
  ¦ ¦ ¦ ¦ }
  ¦ ¦ ¦ ¦ return v;
  ¦ ¦ ¦ }
  ¦ ¦ }, cb);
  ¦ }, function(index, cb) {
  ¦ ¦ app = allApps[index];
  ¦ ¦ updateMasterKey(app.app_id, app.master_key, function(){
  ¦ ¦ ¦ cb(null);
  ¦ ¦ }, true);
  ¦ }, function(cb) {
  ¦ ¦ promptly.prompt('运行环境:\n  0: Node.js (默认)\n  1: Python\n输入序号:', {
  ¦ ¦ ¦ default: '0',
  ¦ ¦ ¦ validator: function(v) {
  ¦ ¦ ¦ ¦ if(urls[v] === undefined) {
  ¦ ¦ ¦ ¦ ¦ throw new Error('序号必须为 0~' + (urls.length - 1));
  ¦ ¦ ¦ ¦ }
  ¦ ¦ ¦ ¦ return v;
  ¦ ¦ ¦ }
  ¦ ¦ }, cb);
  ¦ }, function(index, cb) {
  ¦ ¦ console.log("下载项目模板……");
  ¦ ¦ tmpFile = path.join(TMP_DIR, app.app_id + '.zip');
  ¦ ¦ request(urls[index])
  ¦ ¦ ¦ .on('error', cb)
  ¦ ¦ ¦ .pipe(fs.createWriteStream(tmpFile)).on('close', cb);
  ¦ }, function(cb) {
  ¦ ¦ var unzipper = new DecompressZip(tmpFile);
  ¦ ¦ unzipper.on('error', function (err) {
  ¦ ¦ ¦ console.error('解压缩文件失败:%s,服务器响应:%s', err, fs.readFileSync(tmpFile,'utf-8'));
  ¦ ¦ });
  ¦ ¦ unzipper.on('extract', function () {
  ¦ ¦ ¦ console.log('项目创建完成!');
  ¦ ¦ ¦ cb();
  ¦ ¦ });
  ¦ ¦ unzipper.extract({
  ¦ ¦ ¦ path: './'
  ¦ ¦ });
  ¦ }
  ], function(err) {
  ¦ cb(err);
  });
};

使用 homebrew 安装的 lean-cli 在执行 lean deploy 命令时出错

➜  deploy git:(master) lean deploy
> 获取应用信息 [SUCCESS]
> 准备部署至目标应用:xxxx
> 获取应用分组信息 [SUCCESS]
> 准备部署应用到预备环境
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
        panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x80 pc=0x356f]

goroutine 1 [running]:
panic(0x3bcfe0, 0xc420014130)
        /usr/local/Cellar/go/1.7/libexec/src/runtime/panic.go:500 +0x1a1
github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli.HandleAction.func1(0xc420127928)
        /private/tmp/lean-cli-20160825-86020-ielkme/lean-cli-0.2.0/src/github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli/app.go:476 +0x29e
panic(0x3bcfe0, 0xc420014130)
        /usr/local/Cellar/go/1.7/libexec/src/runtime/panic.go:458 +0x243
main.uploadProject(0xc420019410, 0x21, 0x42359c, 0x1, 0xc420127380, 0x64c67, 0x5e9de0)
        /private/tmp/lean-cli-20160825-86020-ielkme/lean-cli-0.2.0/src/github.com/leancloud/lean-cli/lean/deploy_action.go:68 +0x11f
main.deployFromLocal(0xc420019410, 0x21, 0xc420423098, 0x7, 0x0, 0x0)
        /private/tmp/lean-cli-20160825-86020-ielkme/lean-cli-0.2.0/src/github.com/leancloud/lean-cli/lean/deploy_action.go:95 +0x6c
main.deployAction(0xc4200a4640, 0x0, 0x0)
        /private/tmp/lean-cli-20160825-86020-ielkme/lean-cli-0.2.0/src/github.com/leancloud/lean-cli/lean/deploy_action.go:163 +0x2ae
reflect.Value.call(0x3a8a20, 0x461d78, 0x13, 0x423d17, 0x4, 0xc4201278c8, 0x1, 0x1, 0x770e8, 0x418f80, ...)
        /usr/local/Cellar/go/1.7/libexec/src/reflect/value.go:434 +0x5c8
reflect.Value.Call(0x3a8a20, 0x461d78, 0x13, 0xc4201278c8, 0x1, 0x1, 0x0, 0x138, 0x138)
        /usr/local/Cellar/go/1.7/libexec/src/reflect/value.go:302 +0xa4
github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli.HandleAction(0x3a8a20, 0x461d78, 0xc4200a4640, 0x0, 0x0)
        /private/tmp/lean-cli-20160825-86020-ielkme/lean-cli-0.2.0/src/github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli/app.go:485 +0x1e0
github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli.Command.Run(0x4249ef, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42feb6, 0x21, 0x0, ...)
        /private/tmp/lean-cli-20160825-86020-ielkme/lean-cli-0.2.0/src/github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli/command.go:186 +0xc2b
github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli.(*App).Run(0xc4200fe000, 0xc42000c280, 0x2, 0x2, 0x0, 0x0)
        /private/tmp/lean-cli-20160825-86020-ielkme/lean-cli-0.2.0/src/github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli/app.go:239 +0x611
main.main()
        /private/tmp/lean-cli-20160825-86020-ielkme/lean-cli-0.2.0/src/github.com/leancloud/lean-cli/lean/main.go:121 +0x400

有 package.json 就应该被认作是 Node 项目

jysperm@jysperm-MacBook ~/j/leancloud-restful> lean deploy
> 获取应用信息 [SUCCESS]
> 准备部署至目标应用:LeanCloud Restful (zyC5kGNzjHr74WyTT8pr6pYw-gzGzoHsz)
> 获取应用分组信息 [SUCCESS]
> 准备部署应用到生产环境: web
> 错误的项目目录结构,请确保当前运行目录是正确的云引擎项目
jysperm@jysperm-MacBook ~/j/leancloud-restful> ls
README.md      gulpfile.js    index.html     leancloud.raml node_modules   package.json   public

服务器是的判断逻辑是「同时有 package.json 和 server.js」或「package.json 中有 scripts.start」

读取日志时的错误不应该导致程序退出

因为轮询日志的请求比较频繁,之前也偶尔会有失败,如果失败的话,打印一个错误然后继续执行就可以了,没有必要退出。

现在的情况:

> 正在下载和安装依赖项 ... ...> 删除临时文件 [SUCCESS]
> Get https://leancloud.cn/1.1/engine/events/poll/1474511792973?from=2016-09-22T02:36:37.287Z: net/http: TLS handshake timeout

然后程序就退出了。

支持 `env` 子命令

lean env 输出

export LEANENGINE_APP_ID=xxxxx
export LEANENGINE_APP_KEY=xxxxx
...

方便不想用 lean up 启动项目的用户,可以直接 eval $(lean env)

cli 架构

一个主命令 lean 负责调度

lean 会查找当前目录和 path 下面所有的 lean-xxxx 的可执行文件。每一个 subcommand 都是一个可执行文件,内置的 subcommand 的可执行文件会和 lean 一起发布。第三方也可以在 lean-cli-lib 的基础上编写插件,以 lean-xxxx 的格式命名,安装到 path 里,或者 .lean/thirdparty 一类的目录下。

lean-cli-lib 包含一组共用的基础,比如读取认证信息,读取项目详细之类的。这个lib可以发布到包管理器上去。

lean 启动后根据 subcommand 找到对应 的 lean-xxxx ,并把所有命令行参数传给 lean-xxx 来执行。

lean 支持一些 global options,除了自己的 -v -h 以外,其余的可以作为环境变量传给 lean-xxx 的子命令。

当 lean 没有参数执行的时候,可以列出所有可用的 subcommand 并带有一个简单的说明,这个说明可能是 lean-xxxx -h 的第一行

本地开发时文件变更自动重启服务由各运行环境自行实现

因为个运行环境一般都有自己的开发模式(即监控文件变更并重启服务)的插件,所以命令行工具不再统一做。

不过使用开发模式启动在各个运行环境可能会有不同的命令,所以命令行工具根据不同的运行环境使用不同的调用方式:

  • Node: npm run dev
  • Python:
  • PHP:不需要实现
  • Java:mvn jetty:run

本地环境调试

  • 本地启动开发环境
  • ~~~本地开发环境支持 debug(node debug 等工具)~~~ 不做了,用户可以直接在 package.json 里自己指定

使用lean deploy部署java war 时,发生异常

➜ /Volumes/HDD/work/ideaprojects/leancloud/record >lean deploy

获取应用信息 [SUCCESS]
准备部署至目标应用:* (******)
获取应用分组信息 [SUCCESS]
准备部署应用到预备环境
检测到 Java 运行时
压缩项目文件 ... [SUCCESS]
上传应用文件 30.13 MB / 35.27 MB [=============================>-----] 85.41% 1m49s
panic: invalid character '<' looking for beginning of value [recovered]
panic: invalid character '<' looking for beginning of value

goroutine 1 [running]:
panic(0x3c8800, 0xc4203ba5a0)
/usr/local/Cellar/go/1.7/libexec/src/runtime/panic.go:500 +0x1a1
github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli.HandleAction.func1(0xc420a63880)
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli/app.go:478 +0x247
panic(0x3c8800, 0xc4203ba5a0)
/usr/local/Cellar/go/1.7/libexec/src/runtime/panic.go:458 +0x243
github.com/leancloud/lean-cli/lean/api.NewErrorFromBody(0xc420122f00, 0x2d3, 0x2d3, 0xc421374900)
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/api/error.go:30 +0x163
github.com/leancloud/lean-cli/lean/api.UploadFile(0xc42007b320, 0x21, 0xc4202eb260, 0x53, 0x895a, 0x9600, 0x4)
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/api/file.go:62 +0x653
main.uploadProject(0xc42007b320, 0x21, 0x43c15c, 0x1, 0xc42016d360, 0x65407, 0x616f60)
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/deploy_action.go:89 +0x28a
main.deployFromLocal(0xc42007b320, 0x21, 0xc4204063b8, 0x7, 0x0, 0x0)
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/deploy_action.go:98 +0x6c
main.deployAction(0xc4200c2640, 0x0, 0x0)
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/deploy_action.go:166 +0x2a8
reflect.Value.call(0x3bdba0, 0x47cd18, 0x13, 0x43c8fd, 0x4, 0xc420a63840, 0x1, 0x1, 0x77738, 0x430da0, ...)
/usr/local/Cellar/go/1.7/libexec/src/reflect/value.go:434 +0x5c8
reflect.Value.Call(0x3bdba0, 0x47cd18, 0x13, 0xc420a63840, 0x1, 0x1, 0x643940, 0xc42004d890, 0x80166)
/usr/local/Cellar/go/1.7/libexec/src/reflect/value.go:302 +0xa4
github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli.HandleAction(0x3bdba0, 0x47cd18, 0xc4200c2640, 0x0, 0x0)
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli/app.go:487 +0x1e0
github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli.Command.Run(0x43d5f8, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x448b31, 0x21, 0x0, ...)
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli/command.go:186 +0xc2b
github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli.(*App).Run(0xc420126000, 0xc420090060, 0x2, 0x2, 0x0, 0x0)
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/vendor/github.com/codegangsta/cli/app.go:240 +0x611
main.main()
/private/tmp/lean-cli-20160908-55187-x0qc2a/lean-cli-0.2.1/src/github.com/leancloud/lean-cli/lean/main.go:134 +0x587

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.