- 浏览: 410067 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
冯大圆__渐成胡子渣:
写得很详细,想请求一下,bundler install的时候设 ...
Rails Assets Pipeline -
DaSunWarman:
...
#!/usr/bin/env 脚本解释程序的作用 -
alexag:
...
javascript立即执行函数与函数声明和函数表达式 -
houxm:
你也可以使用更简单的方式(只要在元素上添加 data-togg ...
bootstrap 小tip -
jaycongwen:
帮我看看啊,我刚学wen@wen-desktop:~$ cd ...
cannot load such file -- openssl
Rails支持多种方式的扩展,包括plugin,gem, 或者放到lib文件下等多种方式。 但是随着bundler的出现, Rails3时代我们还是写gem比较好, 方便管理。
所以下面只介绍如何制作属于自己的gem。开始之前先确保你机器了安装了git。
在我们的项目里面, 我看到在config/initializers/下有一个hash.rb文件, 是使用了一个monkey patch的方式来对Hash进行了一个扩展:
class Hash
def # my_reverse
hash_new = Hash.new
self.each {|key,value|
if not hash_new.has_key?(key) then hash_new[value] = key end
}
return hash_new
end
end
像这种扩展方式不是很好, 我想把它修改为一个gem, 如果以后有其他的扩展,比如对Array,Hash等其他方法扩展,我们可以升级gem,这样就方便管理了,不至于那么混乱。
我们开始吧:
1. 安装bundler, 因为我要用bundler来生成一个基础gem结构。
gem install bundler
2. 使用bundler来生成一个基础gem结构:
bundle gem ruby_extendsions
命令执行以后会看到生成下面这些文件:
create ruby_extendsions/Gemfile
create ruby_extendsions/Rakefile
create ruby_extendsions/.gitignore
create ruby_extendsions/ruby_extendsions.gemspec
create ruby_extendsions/lib/ruby_extendsions.rb
create ruby_extendsions/lib/ruby_extendsions/version.rb
Initializating git repo in /Users/alex/work/mygems/test/ruby_extendsions
说明一下:
1). ruby_extendsions.gemspec , 类似于这样的.gemspec文件,就相当于gem的说明书, 将来你打gem包的时候, 就靠这个文件了。
2). lib下放我们的代码实现
3). 整个项目至于git版本控制下。方便我们push到rubygem.org.
3. 使用Rspec进行TDD方式开发我们的代码:
确保我们能用rspec, 在ruby_extendsions.gemspec里添加:
s.add_development_dependency "rspec"
然后,执行:
bundle install
这下我们就可以使用rspec了。
在根目录下增加一个spec文件夹, 考虑到我们要实现的功能, 是对ruby的一些扩展, 所以我暂时就命名为了ruby_extendsions, 而此次只是针对Hash类的扩展, 所以我们需要在spec目录下建立一个测试文件hash_spec.rb和spec_helper.rb来测试我们对Hash扩展功能是否正确:
#spec/hash_spec.rb
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
describe "RubyExtend::HashExtendsions" do
before(:each) do
@hash1 = {:a => 1, :b => 2}
end
it "A hash data should not be reversed if havn't use ruby_extend " do
#当没有使用我们的扩展的时候, Hash类是不应该包含hash_reverse这个方法的, 这个测试也保证了我们在扩展一个Ruby内部类的时候不会和其内部方法名冲突。
@hash1.respond_to?("hash_reverse").should eql false
end
it "A hash data should be reversed" do
require 'ruby_extendsions'
@hash1.hash_reverse.should eql({1=>:a, 2=>:b} )
end
end
上面的代码:spec_helper.rb文件为将来准备,如果扩展其他方法, 会用到一些公用的配置。
测试由一 个正例和一个反例组成。
4. 运行测试:
bundle exec rspec spec
, bundle exec确保rspec是使用我们在.gemspec文件里声明的版本。
当然,测试结果是会失败,因为我们还没有扩展hash_reverse方法呢。
5. 实现代码:
打开lib/ruby_extendsions.rb:
require 'ruby_extendsions/hash_extendsions' #我们今天要实现的Hash扩展
require 'ruby_extendsions/array_extendsions' #以后有可能用到对Array方法的扩展,我们就放这个文件里。
然后在lib/ruby_extendsions目录下建立hash_extendsions.rb文件:
module RubyExtendsions
module HashExtendsions #注意模块的命名要和文件名和路径保持一致。
def self.included(base) #hook, 当这个module在被include的时候触发
base.send :include, InstanceMethods #引入实例方法
base.send :extend, ClassMethods # 引入类方法
end
module InstanceMethods
def hash_reverse #我们的hash_reverse是实例方法
hash_new = {}
self.each {|key,value|
if not hash_new.has_key?(key) then hash_new[value] = key end
}
return hash_new
end
end#InstanceMethods
module ClassMethods
#TODO
end#ClassMethods
end #HashExtendsions
end #RubyExtendsions
#真正的扩展
class Hash
include RubyExtendsions::HashExtendsions
end
上面的代码都带注释了。
然后我们运行测试, oK, 都通过了。大功告成了。
6. 发布我们的gem:
我们修改一下.gemspec文件, 把项目相关信息都写里面去:
# -*- encoding: utf-8 -*-
Gem::Specification.new do |s|
s.name = "ruby_extendsions"
s.version = "0.1"
s.platform = Gem::Platform::RUBY
s.authors = ["naitnix"]
s.email = ["naitnix@126.com"]
s.homepage = "http://rubygems.org/gems/ruby_extendsions"
s.summary = "Ruby Extendsions For Hash"
s.description = "Ruby Extendsions"
s.required_rubygems_version = ">= 1.3.6"
s.rubyforge_project = "ruby_extendsions"
s.add_development_dependency "bundler", ">= 1.0.0"
s.add_development_dependency "rspec"
s.files = `git ls-files`.split("\n")
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
s.require_path = 'lib'
end
然后, 我们在根目录下执行命令:
rake install
这个命令会生成pkg/ruby_extendsions-0.1.gem. 到此为止,我们的gem包就打好了。
你可以把你的gem项目上传到github。 但是github从去年开始就停止了自动打包服务。所以你如果想使用gem install ruby_extendsions命令来安装你的gem, 需要把它上传到rubygems.org里。
首先,你需要在rubygems.org里注册一个帐号。
其次, gem install gemcutter
然后你就push吧。 gem push ruby_extendsions-0.1.gem
如果碰到权限的错误,那说明在rubygems里面已经有了和你一样名字的gem包,换个名字就oK了。
所以下面只介绍如何制作属于自己的gem。开始之前先确保你机器了安装了git。
在我们的项目里面, 我看到在config/initializers/下有一个hash.rb文件, 是使用了一个monkey patch的方式来对Hash进行了一个扩展:
class Hash
def # my_reverse
hash_new = Hash.new
self.each {|key,value|
if not hash_new.has_key?(key) then hash_new[value] = key end
}
return hash_new
end
end
像这种扩展方式不是很好, 我想把它修改为一个gem, 如果以后有其他的扩展,比如对Array,Hash等其他方法扩展,我们可以升级gem,这样就方便管理了,不至于那么混乱。
我们开始吧:
1. 安装bundler, 因为我要用bundler来生成一个基础gem结构。
gem install bundler
2. 使用bundler来生成一个基础gem结构:
bundle gem ruby_extendsions
命令执行以后会看到生成下面这些文件:
create ruby_extendsions/Gemfile
create ruby_extendsions/Rakefile
create ruby_extendsions/.gitignore
create ruby_extendsions/ruby_extendsions.gemspec
create ruby_extendsions/lib/ruby_extendsions.rb
create ruby_extendsions/lib/ruby_extendsions/version.rb
Initializating git repo in /Users/alex/work/mygems/test/ruby_extendsions
说明一下:
1). ruby_extendsions.gemspec , 类似于这样的.gemspec文件,就相当于gem的说明书, 将来你打gem包的时候, 就靠这个文件了。
2). lib下放我们的代码实现
3). 整个项目至于git版本控制下。方便我们push到rubygem.org.
3. 使用Rspec进行TDD方式开发我们的代码:
确保我们能用rspec, 在ruby_extendsions.gemspec里添加:
s.add_development_dependency "rspec"
然后,执行:
bundle install
这下我们就可以使用rspec了。
在根目录下增加一个spec文件夹, 考虑到我们要实现的功能, 是对ruby的一些扩展, 所以我暂时就命名为了ruby_extendsions, 而此次只是针对Hash类的扩展, 所以我们需要在spec目录下建立一个测试文件hash_spec.rb和spec_helper.rb来测试我们对Hash扩展功能是否正确:
#spec/hash_spec.rb
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
describe "RubyExtend::HashExtendsions" do
before(:each) do
@hash1 = {:a => 1, :b => 2}
end
it "A hash data should not be reversed if havn't use ruby_extend " do
#当没有使用我们的扩展的时候, Hash类是不应该包含hash_reverse这个方法的, 这个测试也保证了我们在扩展一个Ruby内部类的时候不会和其内部方法名冲突。
@hash1.respond_to?("hash_reverse").should eql false
end
it "A hash data should be reversed" do
require 'ruby_extendsions'
@hash1.hash_reverse.should eql({1=>:a, 2=>:b} )
end
end
上面的代码:spec_helper.rb文件为将来准备,如果扩展其他方法, 会用到一些公用的配置。
测试由一 个正例和一个反例组成。
4. 运行测试:
bundle exec rspec spec
, bundle exec确保rspec是使用我们在.gemspec文件里声明的版本。
当然,测试结果是会失败,因为我们还没有扩展hash_reverse方法呢。
5. 实现代码:
打开lib/ruby_extendsions.rb:
require 'ruby_extendsions/hash_extendsions' #我们今天要实现的Hash扩展
require 'ruby_extendsions/array_extendsions' #以后有可能用到对Array方法的扩展,我们就放这个文件里。
然后在lib/ruby_extendsions目录下建立hash_extendsions.rb文件:
module RubyExtendsions
module HashExtendsions #注意模块的命名要和文件名和路径保持一致。
def self.included(base) #hook, 当这个module在被include的时候触发
base.send :include, InstanceMethods #引入实例方法
base.send :extend, ClassMethods # 引入类方法
end
module InstanceMethods
def hash_reverse #我们的hash_reverse是实例方法
hash_new = {}
self.each {|key,value|
if not hash_new.has_key?(key) then hash_new[value] = key end
}
return hash_new
end
end#InstanceMethods
module ClassMethods
#TODO
end#ClassMethods
end #HashExtendsions
end #RubyExtendsions
#真正的扩展
class Hash
include RubyExtendsions::HashExtendsions
end
上面的代码都带注释了。
然后我们运行测试, oK, 都通过了。大功告成了。
6. 发布我们的gem:
我们修改一下.gemspec文件, 把项目相关信息都写里面去:
# -*- encoding: utf-8 -*-
Gem::Specification.new do |s|
s.name = "ruby_extendsions"
s.version = "0.1"
s.platform = Gem::Platform::RUBY
s.authors = ["naitnix"]
s.email = ["naitnix@126.com"]
s.homepage = "http://rubygems.org/gems/ruby_extendsions"
s.summary = "Ruby Extendsions For Hash"
s.description = "Ruby Extendsions"
s.required_rubygems_version = ">= 1.3.6"
s.rubyforge_project = "ruby_extendsions"
s.add_development_dependency "bundler", ">= 1.0.0"
s.add_development_dependency "rspec"
s.files = `git ls-files`.split("\n")
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
s.require_path = 'lib'
end
然后, 我们在根目录下执行命令:
rake install
这个命令会生成pkg/ruby_extendsions-0.1.gem. 到此为止,我们的gem包就打好了。
你可以把你的gem项目上传到github。 但是github从去年开始就停止了自动打包服务。所以你如果想使用gem install ruby_extendsions命令来安装你的gem, 需要把它上传到rubygems.org里。
首先,你需要在rubygems.org里注册一个帐号。
其次, gem install gemcutter
然后你就push吧。 gem push ruby_extendsions-0.1.gem
如果碰到权限的错误,那说明在rubygems里面已经有了和你一样名字的gem包,换个名字就oK了。
发表评论
-
ruby module :: 前置操作符
2014-04-02 16:55 747在ruby代码中,我们经常看到有类似这样的获取module的用 ... -
关于Ruby动态方法定义的区别
2014-04-02 16:05 863A.class_eval(<<-EOF, __ ... -
%Q, %q, %W, %w, %x, %r, %s
2014-04-02 10:52 1066%Q 遇到引号嵌套的时候我们往往需要使用反斜线来实现转义,使用 ... -
Ruby extend self
2013-10-22 10:14 991我们想让实例方法同时为类方法,那么可以使用extend sel ... -
$:.unshift File.expand_path('..', __FILE__)
2013-10-22 10:05 1324一直能看到一些gem里面会有这样一句代码: $:.unshif ... -
rails cattr_accessor and mattr_accessor
2013-09-27 09:37 0http://stackoverflow.com/questi ... -
Rails、Nginx、Passenger、bundle,这几者是怎么协作的?
2013-06-27 00:33 1129注:本文转自知乎,原文请参考 Bundle是Gem包的依赖管 ... -
bundle open a specify gem
2013-06-26 23:48 1026今天在看railscasts教程http://railscas ... -
关于测试
2013-06-25 00:52 725http://asciicasts.com/episodes/ ... -
Rails高级编程 笔记
2013-04-23 18:00 0Ruby基础 1、类:主要负责封装和分离事物 2 ... -
ruby通用符号
2013-04-10 22:34 0%Q 当你在”字符串中” 有大量的使用双引号时,频繁的转义字符 ... -
rails_client_validations
2013-02-22 10:57 919看了下rails的服务端验证怎样转换到客户端,实现类似于aja ... -
rails Authration and Password
2013-02-19 18:23 1009以下是我总结的在rails项目中用到的与登录注册相关的资源: ... -
Rails Assets Pipeline
2013-02-03 18:03 7408Assets Pipeline 有什么好处 ... -
deployment RoR with nginx & unicorn on ubuntu
2013-01-09 14:50 1858本来一直都是用rails自带的webrick做本地开发的,但是 ... -
rails attr_protected、 attr_accessible
2013-01-06 10:02 1041attr_protected、 attr_accessible ... -
NewRelic
2013-01-04 17:52 6332NewRelic是一家提供Rails性能监测服务的网站, Ne ... -
rails中处理北京时间以及数据库的时区问题
2012-10-10 11:18 0解释4个时区设置的不同: config.active_rec ... -
eigenclass 与 class 关系
2012-09-20 16:24 1118声明:本文转载自http://ruanwz.github.co ... -
单例模块儿
2012-09-11 17:01 944#单例模块,存在的意义就是在模块被载入类时,给类添加类方法和创 ...
相关推荐
- **鼓励共享精神**:文档中明确表示鼓励用户分享自己的研究成果和经验,共同推动gem5的发展。 - **持续的更新与维护**:gem5项目组致力于保持项目的活跃度,定期发布新版本,并对已知问题进行修复。 总之,gem5...
制作一个简单的gem。
- **导出和报告**:可能提供数据导出功能,便于进一步分析或报告制作。 如果你在使用DerivaGem过程中遇到任何问题,或者需要深入理解二叉树模型及其应用,可以与其他用户或专家联系,共享知识和经验。这个软件是...
通过阅读《GPU Gem1》,读者不仅可以学习到GPU编程的基本概念,还能了解到当前图形学领域的前沿技术,这对于从事视觉艺术、游戏开发、虚拟现实、动画制作等相关工作的专业人士来说,是一份宝贵的参考资料。
"Gem Shader.unitypackage"的导入,将为开发者提供一个现成的工具,他们可以直接应用到自己的项目中,或者作为学习Shader编程的起点。在实践中,你可以通过调整Shader中的参数,观察它们如何影响最终的渲染结果,...
这种自张紧工艺制作的探测器具备无死区、组装便捷、气流均匀等优点,且已成功制造出50cm×100cm的大面积GEM探测器。读出电子学系统由探测器阳极读出板、前端电子学板和数据获取板构成,每个读出单元为1cm²,总有效...
设计中采用了一种名为自张紧工艺的创新方法来制作双层GEM探测器。此工艺已成功应用于制造3-2-2-2结构的50cm×100cm和3-1-1结构的30cm×30cm GEM探测器。自张紧工艺的优势在于能确保大面积GEM探测器的均匀性和稳定性...
宝石 具有简单但可自定义设计的现代...Gem是一个开源项目,它是用JavaFX制作的。 如果您愿意帮助改进Gem并想为该项目做出贡献,请单击以获取更多信息。 执照 版权所有:copyright:2020 Adel Senhadji 该项目已获得许可。
con t con t interface gpon-olt_1/ 2 / 5 interface gpon-olt_...gemport 1 name gemport-1 unicast tcont 1 gemport 1 name gemport-1 unicast tcont 1 gemport 1 traffic-limit upstream gem-10M downstream gem-10M
制作Ruby宝石 想要制作Ruby宝石的人的教程。 为什么是宝石? 在开发Ruby或Rails应用程序时,您希望将代码公开给具有相同功能的开发人员。 因此,您使代码像libarary。 是的,这是一颗宝石。 环境 Ruby2.2.3 栏杆...
制作 卷曲 tar、sed、make(无论如何都应该存在) 安装 gem 安装 openbabel 它下载 OpenBabel 源代码。 如果尚未安装,它会编译并安装 OpenBabel 库。 它安装 OpenBabel ruby 绑定。 如果 OpenBabel 尚未...
注意: ... 如果我错过了一些东西,或者新浪添加了一些东西,请随意将其添加并自己添加。 我会尽力使宝石保持最新状态。 这个宝石是在创建的过程中制作的,请花点时间去检查该项目。 我认为这是与新浪
标题中的“gem:直接使用Web服务制作原型网站”指的是利用Web服务工具来快速构建Flask网站的原型。在Web开发中,原型设计是先于实际开发的重要步骤,它帮助开发者和设计师快速创建出一个功能简单但能展示核心概念的...
目前,这个 gem 仅涵盖授权标头 HMAC SHA 256 签名,并且只返回 JSON 以供您制作。 未来的版本可能会在 Structs 中构造数据。 安装 将此行添加到应用程序的 Gemfile 中: gem 'companies_nz' 然后执行: $ ...
我还想尝试自己制作一个 Ruby gem(我的第一个!),所以我决定制作一个从我的代码中删除所有binding.pry实例的宝石。 就这样,Prybaby 诞生了。安装只需运行gem install prybaby即可gem install prybaby它。使用它...
除了上述提到的关键技术外,文献还提到了在制作GEM专用PCB时会涉及到的材料特性、电路设计要求以及特殊设备的使用。例如,为了获得高精度的同心环,对所用的CCL(Copper Clad Laminate,覆铜层压板)和PCB基材的品质...
rom-fmp 用于rom-rb数据映射和持久性gem的文件制作适配器。 有关Ruby Object Mapper的更多信息,请参见github上的或 。安装将此行添加到您的应用程序的Gemfile中: gem 'rom-fmp'然后执行: $ bundle或将其自己安装...
我发现很多时候,当我制作一些种子数据或在IRB中测试一些呼叫时,我正在输入某些数据,例如电子邮件,URL,或者可能需要指定图像。 我浪费了无数的按键! 因此,我创建了这个小宝石来帮助简化事情,希望它也能对您...
阅读 的制作。 安装 将此行添加到您的应用程序的Gemfile中: gem 'coffee_routes' 然后执行: $ bundle 或者自己安装: $ gem install coffee_routes 用法 在您的应用程序中包含coffee_routes.coffeee # =...
或者自己安装: $ gem install aws_upload 用法 制作初始化脚本来配置上传参数。 在 config/initializers/aws_uplaod.rb AwsUpload . configure do | config | config . aws_access_key_id = ENV [ 'AWS_...