`

require 'rubygems'

    博客分类:
  • gem
阅读更多
寫到一半因為有其他事所以先放著,結果回來就是八小時後了…。
有夠累。

==

大致調查(survey?)了一下要怎麼樣把程式 package 成 rubygem, 主要參考書籍當然是 Programming Ruby 2nd, 這本我看好久還是沒看完的書。(還不都是因為他太厚了…)在 Creating Your Own Gems 這一節中,相當詳細地描述了如何打包(在 MtG 中,不知為何把 entwine 翻譯成打包,瞬間從 spell 的意味變成像外帶一樣)。這邊將簡單示範一次我如何發佈 ludy 的。

首先呢,rubygems 有建議的檔案配置(layout),可以不依照這個規則來做,但一般來說建議使用跟別人相同的方式。所有雜七雜八的東西放在根目錄下,例如 ludy-0.0.1 裡面放的有:ludy.gemspec, LICENSE, NOTICE, README. 其他目錄則是很常見的:bin, doc, lib, test. 我沒有 bin 也沒有 doc, 所以只有放 lib 和 test 兩個目錄。

顧名思義,lib 裡面放的就是 ludy 本身的 source code, 專門拿來給人 require 用。而 test 底下則是所有的 test program, 以 tc_ 開頭的是 TestCase, 可以單獨執行,但主要是由 ts_ 開頭的 TestSuite 去 require 起來,然後 ts_ 會自動執行這些 tc_.

所以我的 ts_ludy.rb 裡面只有兩行:

require(File.join(File.dirname(__FILE__), '..', 'lib', 'ludy'))
require_all_in_dir __FILE__

第一行是把 lib/ludy.rb require 進來,這是使用 ludy 部份元件的必要手續。這樣做的理由是有些 path 問題很煩,所以我把處理 path 的 func 寫在 ludy.rb 中,如此一來需要確保路徑的只有 ludy.rb 這一個檔案。至於為何這裡要使用相對路徑去 require 呢?因為我堅持兩種使用 ludy 的方式,一個是安裝成 gem, 另一個是直接丟到 project 目錄下,使用路徑去 require. 前者不用說,可以有一個很標準的方式使用,但後者就不一定了。

為了處理這個問題,ludy 內部需要某些其他 ludy tool 時,就改用 require_ludy, 集中處理 require 問題,避免重複把相同路徑加入 load path. 使用者當然也可以使用 require_ludy, 或是依然習慣使用 require, 那麼只要確定自己 require 的 path 是正確的就好了,ludy 內部不會有路徑問題。至於 gem version, require 的方式就很單純用 require 'ludy/tool_name' 或是 require_ludy 'tool_name' 就好了。

第二行,則是把所有 tc_ 開頭的 TestCase require 進 TestSuite 裡面,(其實是同個目錄下所有的 .rb 檔,只是現在 test/ 下只有 tc_ 和正在執行的 ts_ 而已)unit test 就會自動執行了。不過這個 require_all_in_dir 的第一個參數卻是檔案名稱,名字好像取得不太好的樣子。

ok, 也就是說我要打包的東西是 ludy.gemspec, LICENSE, NOTICE, README, lib/*.rb, test/*.rb. 其中 lib/ 底下還有其他資料夾,也要一併打包。那麼寫好的 gemspec 就是


require 'rubygems'

spec = Gem::Specification.new{|s|
s.name = 'ludy'
s.version = '0.0.1'
s.author = 'Lin Jen-Shin(a.k.a. godfat)'
s.email = 'strip number: 135godfat7911@246gmail.890com'
s.homepage = 'http://ludy.rubyforge.org/'
s.platform = Gem::Platform::RUBY
s.summary = 'Aims to extend Ruby standard library, providing some useful
tools that\'s not existed in the standard library.'
candidates = Dir.glob '{bin,doc,lib,test}/**/*'
candidates+= Dir.glob '*'
s.files = candidates.delete_if{|item|
item.include?('CVS') || item.include?('rdoc') ||
File.extname(item) == '.gem'
}

s.require_path = 'lib'
s.autorequire = 'ludy'
s.test_file = 'test/ts_ludy.rb'
s.has_rdoc = false
# s.extra_rdoc_files = []
# s.add_dependency 'multi', '>=0.1'
}

if $0 == __FILE__
Gem::manage_gems
Gem::Builder.new(spec).build
end


其中 Dir.glob 的部份我還沒研究,所以寫得很爛,居然用補正的方式。反正就是全部抄自 Programming Ruby 2nd, 再做一點修修改改。其中最下面的 if $0 == __FILE__ 可以判斷這個程式是不是直接被 ruby interpreter 執行?如果是的話,就呼叫建立 rubygem 的 method. 不是的話,就只要定義 spec 就好了。

前者就是:
ruby ludy.gemspec
或是如果有加 #! 的話:
./ludy.gemspec
如果 ludy.gemspec 在現在目錄下的話。

後者就是:
gem build ludy.gemspec

這兩種方式都可以產生 ludy-0.0.1.gem. 接著再下:
gem install ludy
就可以正確安裝 ludy gem 了。至於 remote 的部份呢?只要上傳到 rubyforge 的 file release system 上,rubyforge 每日會有數次掃描裡面的 *.gem, 自動放到 rubygems 的 repository. 這件事我已經做完了,所以現在可以直接:

gem install ludy

就能看到我寫的一點程式了 :)
不過其實我只是在測試功能而已,本來是想標版本號 0.0.0, 可惜這樣用:

gem uninstall ludy

時會出一點問題。所以就還是標成 0.0.1, 但未來的更新暫時都不改版本號。正式釋出時大概會是 0.0.2 吧 :p 還是歡迎大家抓回去試試,使用方法全在 unit test 裡面,文件懶得寫了。

homepage:
http://ludy.rubyforge.org/
有空時會弄個應有的版面出來。

2007.05.02 godfat 真常
分享到:
评论

相关推荐

    require.js学习指南

    require.jsrequire.jsrequire.jsrequire.jsrequire.jsrequire.js

    详解小程序循环require之坑

    1. 循环require 在JavaScript中,模块之间可能出现相互引用的情况,例如现在有三个模块,他们之间的相互引用关系如下,大致的引用关系可以表示为 A -> B -> C -> A,要完成模块A,它依赖于模块C,但是模块C反过来又...

    require-css.js

    在非专业前端开发的工作中(比如使用vuejs开发),免不了要进行模块化,js的加载使用require.js就可以了,但是对于.css文件的加载需要使用插件,在试用了github上提供的require.js后发现不太好用(报错,还得改人家...

    php与JS直接的互调

    C php可以调用文件外的php函数 只要include 或require "filename"">压缩包里详述以下内容: JS: A 可以调用文件外js的函数 只要<title>< title><script language "JavaScript&quot...

    requireDir, node.js helper 到 require() 目录.zip

    requireDir, node.js helper 到 require() 目录 requireDir ( )node helper 到 require() 目录。 检查目录文件,并且可以为 require()的每个文件都具有 require(),并作为散列的一部分返回到它的导出的内容。示例...

    Nodejs中的require函数的具体使用方法

    本文主要分析了Nodejs中require导入JSON和js文件时得到的结果,同时简单涉及到了Nodejs中模块导出module.exports和exports的用法。 引言 在阅读webpack源码的过程当中,见到如下一行代码: const version = ...

    require.js教程

    本书籍主要讲解了require.js如何使用,以及在使用过程中有哪些容易出问题的地方,适合工作中使用require.js开发的项目

    require.js文件

    require.js用于模块化管理javascript的管理工具,非常实用

    lua iconv For windows

    local iconv require "luaiconv" local cd iconv new "utf 8" "gbk" local nstr err cd:iconv str http: blog csdn net sniffer12345 article details 16359043">在windows下...

    微信小程序require 引用 BASE64.JS 失败问题的分析解决

    有朋友问, 微信小程序require ('base64.js')文件时,会失败,,, # 分析 事实上,微信小程序require很多JS模块都有不兼容现象。。。先从base64.js这个模块入手吧。 调试出错点: ~~~~ (function(global) {  'use ...

    require.js.rar

    require.js.rar

    require-css 兼容IE respond

    根据require-css respond.js 修改而来,使之兼容IE respond(媒体查询) 说明文档参见:github.com/ijiabao/require-css-respond

    require+ jquery+iscroll+afui

    require+ jquery+iscroll+afui

    require.js插件-text.js使用

    require.js插件 require.js还提供一系列插件,实现一些特定的功能。 text.js插件的使用

    Laravel开发-laravel-require

    Laravel开发-laravel-require 添加带有composer的包,并自动注册服务提供程序。

    ionic与require+angular实现模块分离完整实例

    ionic与require+angular实现模块分离完整实例

    require.js

    require.js2.3.5 /** vim: et:ts=4:sw=4:sts=4 * @license RequireJS 2.3.5 Copyright jQuery Foundation and other contributors. * Released under MIT license, ...

    include和require的区别

    详细介绍了include和require的区别

    Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法

    本文实例讲述了Laravel框架访问出错提示:`Warning require(vendorautoload.php) failed to open stream No such file or dire解决方法。分享给大家供大家参考,具体如下: 错误信息: `Warning: require(/...

    require+r.js打包

    实现require.js+r.js在node环境下合并,打包,压缩JS代码

Global site tag (gtag.js) - Google Analytics