开源项目 使用 Ruby 编写了另一个 damned 包管理器

dongli1985 · 2015年11月12日 · 最后由 dongli1985 回复于 2015年11月14日 · 3895 次阅读

我从去年 8 月份开始,利用业余时间(好吧,其实也占用了工作时间)开发了一个类似 Homebrew 的跨平台(支持 Mac,Linux,Cygwin)的包管理器,也是用 Ruby 写的。为啥要再写一个 damned 包管理器呢?实在是因为本专业(科学计算范畴)对编译器的要求比较多,常常需要用 Intel 或者 PGI 编译器,而一般的包管理器都是默认 GNU 的,而且软件包的版本也是落后不少,导致在一台服务器上经常要手动编译一个软件包,由于有依赖关系,往往还要装一堆烦人的依赖包,如果加上服务器不能够联网,那么就更加不能愉快地玩耍了。

于是乎,我开始考虑使用 Homebrew,但是这货是生为 Mac 人,死为 Mac 鬼,压根没考虑过 Linux 的感受(虽然有个 Linuxbrew 衍生,但是基本很难用),因此我寻思着用 Ruby 也很多年了,干嘛不实践一把,不就是要用点元编程嘛?我开始翻看 Homebrew 的源程序,看看也没啥特别的,主要是设计 Formula 的 DSL 这块是我没有用过的,学习了一下(好吧,依葫芦画瓢),也整起来~ 最终造了一个名为 PACKMAN(PACMAN 被占用)的包管理器,项目地址是https://github.com/dongli/packman

下面是一个包安装流程的例子:

class Redis < PACKMAN::Package
  url 'http://download.redis.io/releases/redis-3.0.3.tar.gz'
  sha1 '0e2d7707327986ae652df717059354b358b83358'
  version '3.0.3'

  label :compiler_insensitive

  option :use_jemalloc => false
  option :config_file => :string # Default: .../etc/redis.conf

  def install
    args = %W[ 
      PREFIX=#{prefix}
      CC=#{PACKMAN.compiler(:c).command}
    ]
    args << 'MALLOC=jemalloc' if use_jemalloc?
    PACKMAN.run 'make install', *args
    %w[run db/redis log].each { |p| PACKMAN.mkdir var+'/'+p }
    PACKMAN.replace 'redis.conf', {
      '/var/run/redis.pid' => var + '/run/redis.pid',
      'dir ./' => 'dir ' + var + '/db/redis/',
      '# bind 127.0.0.1' => 'bind 127.0.0.1',
      'daemonize no' => 'daemonize yes'
    }   
    PACKMAN.mkdir etc 
    PACKMAN.cp 'redis.conf', etc 
    PACKMAN.cp 'sentinel.conf', etc+'/redis-sentinel.conf'
  end 

  def start options = {}
    config_file = [config_file, options[:config_file], "#{etc}/redis.conf"].find { |x| x } 
    PACKMAN.run "#{bin}/redis-server #{config_file}"
  end 

  def status
    PACKMAN.run "#{bin}/redis-cli info", :skip_error
    $?.success? ? :on : :off
  end 

  def stop
    return 'already off' if status == :off
    PACKMAN.run "#{bin}/redis-cli shutdown"
  end 
end

现在 PACKMAN 已经被我们专业的很多同志用了起来,大大减少装软件的痛苦。不过由于周围的人都不是做 IT 的,基本没有 PR 的能力,而且我深知开源软件如果得不到社区的扶植就是等死,所以呢,我还是想回归 Ruby 社区,希望能够得到大家的支持(主要是 PR~)。

虽然 PACKMAN 起初主要考虑科学计算这块,但是也可以快速安装 Ruby,Postgresql,Redis,Nginx 之类的做网站必须的软件(本人最近也在做个相关的创业工作),而且提供统一的管理接口,比如:

$ packman start postgresql
$ packman start redis

供具有洁癖的同志们使用。欢迎大家来拍砖!

牛逼啊,那么多 Package 调试起来都要花要多时间

#1 楼 @huacnlee 嗯,慢慢调试,享受不断完善的过程。我的同事对我也还算有忍耐度 :)

牛逼啊,看起来比 homebrew 强大

如果 Linuxbrew 不是有根本性的缺陷,建议加入 Linuxbrew 的开发。

#5 楼 @rei 嗯,不过已经开发了一年多了,而且已经成形,并实际使用了。我之前和 Linuxbrew 的开发者联系过,不过他比较保守,不愿意做过多剪裁。

为楼主的精神点赞,期待楼主早点找到合作伙伴。

#7 楼 @hubery 谢谢鼓励~ 翘首以盼!虽然代码可能不那么美,但是可以不断改进。

9 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号