• 做一个幸福的人,读书,旅行,努力工作,关心身体和心情。
  • 不管有没有人爱,也要努力做一个可爱的人。不埋怨谁,不嘲笑谁,也不羡慕谁,阳光下灿烂,风雨中奔跑,做自己的梦,走自己的路。

Truffle 代码运行流程

区块链 lcq 1年前 (2017-06-20) 455次浏览 1个评论

以最简单truffle version查看版本为说明

首先根据软链接(软连接根据truffle实际安装路径链接)

sudo ln -s /usr/lib/node_modules/truffle/cli.js /usr/local/bin/truffle

sudo ln -s /usr/lib/node_modules/truffle/exec.js /usr/local/bin/truffle-exe

执行truffle,实际执行的是cli.js文件。根据cli最前面的#!/usr/bin/env node,实际使用node执行。

所以,执行实际过程是truffle version --> /usr/lib/node_modules/truffle/cli.js version --> node /usr/lib/node_modules/truffle/cli.js version 即你使用后面两个命令跟使用truffle version的效果是一摸一样的。

根据上面的线索,进入cli.js文件。

cli.js文件执行了一句command.run(process.argv.slice(2), function(err) { ... });

其中process.argv.slice(2) 就是字符串 ‘version’;

根据var Command = require("./lib/command");进入command.js文件。

查看Command.prototype.run = function(command, options, callback) { ... }

虽然前面cli.js只传入了两个实参,这里需要三个实参,但run检查到第二个实参是函数的时候,会赋值给callback,同时将option置为空对象”{}”。最后执行run实际执行的是task(option, callback)。

那么,现在只要把task(option, callback)到底怎么执行了什么弄清楚了,就把所有整个流程就弄清楚了。

我们回到cli.js。在构造command对象的时候是这样的:var command = new Command(Tasks);

而在command.js里面,task实际是这样来的var task = this.getTask(command);根据这条语句简要分析可以得到task函数其实来自构造command对象的时候传入的Tasks。

根据var Tasks = require(“./lib/tasks”);我们进入tasks.js文件分析Tasks对象。

进入tasks.js文件,引入依赖之后,定义了一个变量:var Tasks = {};最后导出了这个变量:module.exports = Tasks;所以在command.js里面Tasks变量其实就是这个导出的变量,而这个导出的变量里面有哪些内容呢?

我们在tasks.js文件里面,看见调用了很多遍的createTask(name, description, fn)函数,执行完成之后,导出的Tasks对象从空对象变成了大概如下的对象(注意:description跟task_name是函数[Function]对象下面的两个属性):

而根据command.js里面的var task = this.tasks[task_name];所以task根据你传入的参数task_name 即’version’,从tasks.js导出的Tasks对象中取出对应的函数。至此可以明白了,task(option, callback)实际执行了tasks.js里面的第三个参数(第三个参数为函数):

而done()就是command.run(process.argv.slice(2), function(err) { … });里面第三个回调function(err) { … }。

至此,执行truffle version的整个流程就清晰明了了!其他如执行truffle console可参照此流程进行分析。


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Truffle 代码运行流程
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址