Julia 和 Ruby 提交 package 流程一点记录跟疑问

649 查看

写 Cirru Parser 的原因, 对照文档搞了半天, 也是搞定了.
然后回头来一想, 好多地方搞不明白的, 以后万一模块需要维护恐怕还麻烦
所以打算留一点笔记在这里, 也留一点感想希望有多一点人重视这些东西

Julia

Julia 的模块也有自己的网站, 做为新兴的语言, 算是了不起了
http://pkg.julialang.org/
托管的方案比较理想化, 使用 GitHub 管理的, 一个仓库里边的列表,
里边还会记录很多模块的信息, 以及 Jarvis 生成的版本数据等等
https://github.com/JuliaLang/METADATA.jl
完整的文档可以看官方的, 详细过头了, 另外也有中文的文档翻译:
http://julia.readthedocs.org/en/latest/manual/packages/
https://github.com/JuliaCN/julia_zh_cn

Julia 管理模块用的不是命令行, 而是 REPL, 比如 Pkg.install('package')
安装的模块都在 ~/.julia/ 目录下, 而且可以用简单的语法 pin 版本
Pkg 模块下挂载的方法还是很强大的, 我在 npm 当中基本的需求也算都有
甚至有个 Pkg.rm('package'), 实际是移动到 trash/ 目录当中, 还好不是真的删除.

用户的机器上 ~/.julia 目录下存在一个 METADATA/ 目录, 对应 GitHub repo
所有的模块都在这个仓库里注册, 查找其中的地址, 然后从 GitHub 下载
下载的模块也一直存储在 ~/.julia/ 这个目录当中, 直接访问就能看代码
而注册一个模块实际上是往 METADATA/ 里写数据, 然后提交 PR 请求.
Pkg.register('package') 就是为了自动完成这个事情,
只不过 register 反应很慢, 或许是国内网络的原因, 我最终还是手动提交的 PR

Julia 这样的管理方式, 让我想到的是 Sublime Text 跟 Atom, 他们的模块就这样管理的,
所以开发了新的模块需要到 GitHub 上 fork 他们的仓库, 然后审核.
而用 GitHub 托管模块, 像是 Go 社区做法, 而且 Go 也是有的专门目录存放模块
Julia 模块 PR 比较后会触发 Jarvis, 运行模块中的测试, 来检验下模块的质量

另一个就是模块引用的问题了, Julia 有三种引用模块的函数 import using include
具体我也常常弄乱, 中文翻译的文档上有个表, 我建议是看这个表
https://github.com/JuliaCN/julia_zh_cn/blob/1d8a792e374c71c47c9202286c...
importusing 在功能上似乎有不少重合的地方, 不明白为什么这样设计
总体感觉有点复杂, 但也不打容易出错, 我第一次写, 问题也不是很大
模块的写法, 用 module 包裹, 用 export暴露方法, 然后就可以了, 教程清晰

我最后完成的例子是这样的, 带测试源码结构也简单
https://github.com/Cirru/CirruParser.jl
我注意到 Julia 的社区很小, 主要也就是邮件列表人挺多的每天有帖子
https://groups.google.com/forum/#!forum/julia-users
其他的话 Gitter 上也就一两个人, 很冷清
http://julialang.org/community/
https://gitter.im/JuliaLang/julia
但是从整体设计上算是很棒的了

加一点, Julia 大概是没有打包可执行命令的标准方案, 文档跟社区都没找到
我应对的办法就只有说 README 里写一段, 手动加软链接了

Ruby Gem

Gem 编写虽然有中文 Ruby 社区, 但是总体感觉还是要比 Julia 难一些
首先我引用 Node 模块, 模块名 a, 文件名 ./a, 非常明确
Julia 当中 import 查找模块以及当前路径, 也很容易查找问题
到了 Ruby 真是绕了我半天, 又是 $LOAD_PATH 又是版本更新废弃用法...
好吧弄明白 $LOAD_PATH 算好点, 硬生生在文件里加上代码指明引用相对的位置:

ruby$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib")

另外遇到个问题就是引用模块提示找不到方法:
https://ruby-china.org/topics/25290
大概只是因为 Ruby 的 module 关键字用法跟 Ruby 不同导致的
站在我的角度, Ruby 在设计上不含糊的地方真是不少, 有点难受
细节我没法说清楚, 但是我完成的版本是这样的, 很多奇怪的写法:
https://github.com/Cirru/parser.rb

Ruby 发布 Gem 的流程倒是非常干脆, 注册帐号, build, push, 好了.
附带一些填写 gemspec 运行 bundle 在文档上算比较明确
不过我还是有点糊涂, gem bundle 两套命令究竟什么原因
相对有 Node 来说, Ruby 还有 Julia 会自动生成模块模版, 也挺有意思的
gem 是统一安装在系统当中的, 这个我没深入看了

感想

两年前我拉过一次列表, 稍微看了下各种不同的编程语言打包是怎样的:
https://github.com/coffee-js/languages/wiki/各种编程语言的模