golang 标准库间依赖之可视化展示

简介

语言 1

国庆关押罢 << Go 语言圣经
>>,总想做点啊,来深化下印象.以可视化的不二法门示 golang
标准库之间的指,可能是一个于好的切入点.做事先,简单搜了产系的情,网上为只要讨论,但是没察觉直接会以过来用的.标准库之间,是必有因关系之,不同库被依的水平必然是未一样的.但究竟生差不多大差异吗?

以下内容,数据源自真实环境之 golang 1.9
版本的规范库.所以,本文不仅是如出一辙首而视化相关的座谈文章,更是提供了一个可一直追究
golang 标准库间依赖关系之快捷梳理工具.

前言

立马篇稿子针对性的凡冲 LuaJIT 的条件布置。借助于 LuaJIT,Lua
的实践效率可以更升级几十倍。如果你免是殊清楚自己是待 Lua 还是
LuaJIT,那么建议乃于 LuaJIT 起步。LuaJIT 对应的凡 Lua5.1
的语法,这或多或少急需留意。

只要您想看基于最新版 Lua
环境之部署文章,请动:http://yanfeng.life/2017/11/10/Latest-guid-for-lua/

多少准备

标准库各个包中的相互关系,可以一直通过命令获取,然后简单转换为一个业内的
JSON 对象:

go list -json  std

演示输出:

{
    "Dir": "/usr/local/go/src/archive/tar",
    "ImportPath": "archive/tar",
    "Name": "tar",
    "Doc": "Package tar implements access to tar archives.",
    "Target": "/usr/local/go/pkg/darwin_amd64/archive/tar.a",
    "Goroot": true,
    "Standard": true,
    "StaleReason": "standard package in Go release distribution",
    "Root": "/usr/local/go",
    "GoFiles": [
        "common.go",
        "format.go",
        "reader.go",
        "stat_atimespec.go",
        "stat_unix.go",
        "strconv.go",
        "writer.go"
    ],
    "IgnoredGoFiles": [
        "stat_atim.go"
    ],
    "Imports": [
        "bytes",
        "errors",
        "fmt",
        "io",
        "io/ioutil",
        "math",
        "os",
        "path",
        "sort",
        "strconv",
        "strings",
        "syscall",
        "time"
    ],
    "Deps": [
        "bytes",
        "errors",
        "fmt",
        "internal/cpu",
        "internal/poll",
        "internal/race",
        "io",
        "io/ioutil",
        "math",
        "os",
        "path",
        "path/filepath",
        "reflect",
        "runtime",
        "runtime/internal/atomic",
        "runtime/internal/sys",
        "sort",
        "strconv",
        "strings",
        "sync",
        "sync/atomic",
        "syscall",
        "time",
        "unicode",
        "unicode/utf8",
        "unsafe"
    ],
    "TestGoFiles": [
        "reader_test.go",
        "strconv_test.go",
        "tar_test.go",
        "writer_test.go"
    ],
    "TestImports": [
        "bytes",
        "crypto/md5",
        "fmt",
        "internal/testenv",
        "io",
        "io/ioutil",
        "math",
        "os",
        "path",
        "path/filepath",
        "reflect",
        "sort",
        "strings",
        "testing",
        "testing/iotest",
        "time"
    ],
    "XTestGoFiles": [
        "example_test.go"
    ],
    "XTestImports": [
        "archive/tar",
        "bytes",
        "fmt",
        "io",
        "log",
        "os"
    ]
}

梳理了的数据源,参见:
https://raw.githubusercontent.com/ios122/graph-go/master/data.js

脚本语言,你可能再度得的是 Lua

差的脚本语言有不同之风味,第一沾的脚本语言,可能会见潜移默化自己对整脚本语言的明亮和认知。我先接触最多的脚本语言是
JavaScript。后果就是是:我早已觉得脚本语言都是得跟宿主语言运行在不同的过程;脚本本身的语法受条件的震慑挺要命,很不便形成统一;如果想统一写法,都亟待以用体积上做出十分特别之折衷(嵌入一个通用的
JS 解释器,会如应用体积增大十几 M)。

自家当试着开有大力,去改善为大气使 JavaScript
引起的一部分一定的技巧问题。但是有时之中又想起了 Lua。最初步是于玩 WOW
的室友那里听说 Lua 的。因为他说写WOW插件很赚钱,所以已经认真地搜索了
Lua,现在脑海中发出局部遗留的片段。

自家恍然发现及,可能 JavaScript 的多数限制,在 Lua
或其它脚本语言中连无有。想要化解那些以用 JavaScript
引起的各种问题,可能才需要更换一派系脚本语言。

本,此处不考虑通常意义及之运难度,学习难度,推广成本平近乎的要素;毕竟自己是纯自嗨。但只要,Lua
真的克挺好解决自己当下赶上的脚本语言无法与宿主语言灵活通信的题材,必将被好的完全知识体系拉动一个初的升迁,也必将以协调之便履着开创有累累初的也许。

可视化原理

重点干一下情:

  • 可视化显示,使用的凡 echarts

  • 下原有数据的 ImportPath 而无是
    Name,来当每个数据节点的唯一id.这样是因 golang
    本身的包命名规范控制的.

  • 行使初数据的 Imports
    字段,来确定专业库包与保中的相互依赖关系.golang是无容许循环依赖之,所以有巡回依赖相关的题材,不待考虑.

  • 节点的深浅,和包被外保险引入的次数成正相关.这样做,被因越多的担保,图及最终显示时,就见面更加大.常用包和非常因此包,一目了然.

所波及的相继工具的版本

  • 编程语言: LuaJIT 2.0.5 (对应 Lua 5.1的语法)

  • Lua 模块管理工具:LuaRocks 2.3.0(LuaJIT版)

  • 编辑器:IntelliJ IDEA CE (社区版)

Build #IC-172.4343.14, built on September 26, 2017
JRE: 1.8.0_152-release-915-b12 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.13.1

  • 调剂插件:EmmyLua 1.2.0

  • 操作系统:macOS 10.13.1

  • macOS 专用模块管理工具: Homebrew 1.3.6

以下讨论,均为 macOS 为主,其他系统平台只是供参考。

多少整理

纵然将原本数据,处理成 echarts 需要的数目,这里大概说生最基本的笔触:

  • echarts 显示相关的代码,很怪程度及参照了
    graph-npm

  • 节点坐标和颜料,采用擅自坐标和颜料,以删节点和保里面的联系.我以为这样处理,能更纯粹地观察标准库包与保中的联系.

  • 亟待一个 edges 来记录包与保里面的依靠关系.在每次遍历 Imports
    时,动态写入.

  • 消一个 nodes 来记录包自身的局部音,但是那 size
    参数,需要计算过所有乘关系后再次填充入.

  • 以 nodedSize
    来记录每个包吃据之次数,为了提升效率,它是一个字典Map.

    /* 将原本数据,转换为图标友好之数据.

    ImportPath 作为唯一 id 和 标签;
    Imports 用于计算依赖关系;
    节点的大小,取决于被依赖的次数;
    */
    

    function transData(datas){

    /* 存储依赖路径信息. */
    let edges = []
    
    /* 存储基础节点信息. */
    let nodes = []
    
    /* 节点尺寸.初始是1, 每被引入一次再加1. */
    let nodedSize = {}
    
    /* 尺寸单位1. */
    let unitSize = 1.5
    
    datas.map((data)=>{
        let itemId = data.ImportPath
    
        nodes.push({
            "label": itemId,
            "attributes": {},
            "id": itemId,
            "size": 1
        })
    
        if(data.Imports){
            data.Imports.map((importItem)=>{
                edges.push({
                    "sourceID": importItem,
                    "attributes": {},
                    "targetID": itemId,
                    "size": unitSize
                })
    
                if(nodedSize[importItem]){
                    nodedSize[importItem] = nodedSize[importItem] + unitSize
                }else{
                    nodedSize[importItem] = unitSize
                }
            })
        }
    })
    
    /* 尺寸数据合并到节点上. */
    nodes.map((item)=>{
        let itemId = item.id
        if(nodedSize[itemId]){
            item.size = nodedSize[itemId]
        }
    })
    
    return {
        nodes,edges
    }
    

    }

安装 LuaJIT

功效和源码

  • github 源码: https://github.com/ios122/graph-go
  • echarts 在线预览:
    http://gallery.echartsjs.com/editor.html?c=xSyJNqh8nW

下载 LuaJIT 源码

下载地址:http://luajit.org/download.html

诚如应选择新型的 Stable 稳定版本。下载后解压。

语言 2

相关链接

  • echarts
  • graph-npm

编译 LuaJIT

编译非常简单,cd 到 LuaJIT 源码解压目录,然后在终极履行:

make && sudo make install

验证 LuaJIT 安装是否中标

打开终端履行:

luajit -v

装成功后,应该产生以下类似输出:

LuaJIT 2.0.5 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/

安 Lua 模块管理工具:LuaRocks

开拓 macOS 终端,输入以下指令:

brew tap mesca/luarocks
brew install luarocks51 --with-luajit

LuaRocks
的装也发出多种方法,这是较为简化高效的一模一样种植。需要注意的凡,以之种办法安装,LuaRocks
的调用命令,将变成 luarocks-jit

语言 3

慎选一个宜的 Lua 编辑器: IntelliJ IDEA CE

Lua 日常编码,推荐应用 IntelliJ IDEA
CE(社区免费版),下载地址:https://www.jetbrains.com/idea/download/

重大是自配置难度,语法高亮,代码提示,代码调试等方面衡量。

语言 4

动 EmmyLua 插件配置调试环境

安装 EmmyLua

Lua 的调节以及高亮,主要受益于 EmmyLua。在 IntelliJ IDEA CE 的 Plugins
中,直接搜索安装即可。记得,要先安装之插件,然后再度新建工程。安装此插件后,工程模板,会多一个
Lua 模板选项。从 Lua 模板新建工程,会简化许多 Lua 相关的安排。

语言 5

安装 luasocket

每当装 EmmyLua 插件之后,还用装一个 Lua 库
luasocket,才能够开展调节。

开拓终端,输入以下指令:

sudo luarocks-jit install luasocket  

改 Lua 路径配置

Lua 的部署路径而于默认的 lua,改也 luajit 命令的诚实路径,一般是
/usr/local/bin/luajit

语言 6

始于调试

于 IntelliJ IDEA CE 中初建 Lua 工程,然后新建 Lua 文件
hello.lua,输入代码:

-- defines a factorial function
function fact (n)
    if n == 0 then
        return 1
    else
        return n * fact(n - 1)
    end end
a = 6
print(fact(a))

在编辑区左侧,打及几个断点,然后文件编辑区右键,选择 Debug ‘hello.lua’:

语言 7

一同简单看下 Debug 断点调试之效益:

语言 8

部署 LuaCheck 静态检查工具

率先以在终极命令执行执行:

sudo luarocks-jit install luacheck

然后在安装页,配置 LuaCheck 的整路径: /usr/local/bin/luacheck

语言 9

现在编辑区右键菜单中选择 “Run
LuaCheck”,就可开展静态检查了。不过首接触还是运行某些示例代码时,不用过分纠结静态检查的警戒。

语言 10

注意事项

  • 安 LuaJIT ,不待装 Lua 5.1 了

  • 自然是只要当布置好 EmmyLua 插件后,直接冲新出现的 Lua
    模板新建工程;否则在改项目布局达到,可能会见花许多年华。

  • 调剂时报错 module ‘socket’ not found ,是以无设置
    luasocket。

  • Lua 因MIT
    开源,如果哪天想自己定义某种新语言来贯彻特定的制品特色,可以设想因
    Lua 定制。

  • Lua
    支持各种低级硬件嵌入式开发,可移植性非常好,物联网时代或者会见出新的可能与增长潜力。

  • 倘感觉 luajit 没有 lua 写着好,可以试着以 .profile 中配置
    alias 命令别名,详见:https://stackoverflow.com/a/8967864

alias lua="/usr/local/bin/luajit"
alias luarocks="/usr/local/bin/luarocks-jit"
  • 指令别名,不能够 sudo 执行,如安装 luasocket 时,还是待 sudo
    原始命令:

sudo luarocks-jit install luasocket

  • 设若已经设置过 Lua 5.1,可能用事先转移除其:

brew unlink lua@5.1
  • 编码时,光标移动至下一行的快捷键语言是:

cmd + shift + enter

小结

如上介绍了 macOS 平台,LuaJIT
从安到布置调试环境之整经过。接下来,就足以因自己之韵律与得,好好了解
Lua 之美了~

参考文档:

  • 怎样被命令设置别名?
  • 运用 hombrew 安装不同版本的 Lua 和
    LuaRocks
  • EmmyLua 插件主页
  • Lua 官网
  • LuaRocks官网
  • IntelliJ IDEA 官网
  • LuaJIT 项目主页
  • Homebrew 官网

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图