加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 我应该如何在开发过程中尝试我的宝石?

发布时间:2020-12-16 19:20:41 所属栏目:百科 来源:网络整理
导读:假设我有一个名为foo的gem,其文件结构如下: foo.gemspectest_foo.rblib/foo.rblib/foo/file1.rblib/foo/file2.rb 文件test_foo.rb包含一些我用来试用我的gem的代码.它使用以下行访问gem的代码: require './lib/foo' 然后,lib / foo.rb加入gem所需的其他文
假设我有一个名为foo的gem,其文件结构如下:
foo.gemspec
test_foo.rb
lib/foo.rb
lib/foo/file1.rb
lib/foo/file2.rb

文件test_foo.rb包含一些我用来试用我的gem的代码.它使用以下行访问gem的代码:

require './lib/foo'

然后,lib / foo.rb加入gem所需的其他文件,如下所示:

require './lib/foo/file1'
require './lib/foo/file2'

由于test_foo.rb位于gem目录的根目录中,因此必须要求lib / foo中的文件具有来自根目录的完整路径.

这一切都很好,并允许我通过更改test_foo.rb中使用的代码立即玩我的宝石.

但是,如果我想构建gem,那么我必须将我的调用更改为require,如下所示:

require 'foo/file1'
require 'foo/file2'

代替

require './lib/foo/file1'
require './lib/foo/file2'

每次我想要构建宝石时,这都是一种乏味的做法.

所以,我想到了另一种尝试它的方法,即使用rake自动构建和安装gem,如下所示:

task :build do
    `gem build foo.gemspec`
    `gem uninstall foo`
    `gem install ./foo-0.0.0.gem`
end

然后当我对我的代码进行更改并想要尝试时,只需运行rake build,并在test_foo.rb中调用require’foo’.

但这是一个相当缓慢的过程,感觉有点像它击败了ruby作为一种语言,在你尝试之前你不必构建你的代码.

所以,我的问题是,在积极开发gem并测试它时,最好的工作流程是什么?

解决方法

它容易出错并且容易混淆源文件中的require路径,以使代码在不同情况下运行(本地测试,“生产”作为gem等).

你可以使用一些技巧来“编写一次,随处运行”(抱歉Java,偷窃).这也是您应该瞄准的目标,使用这些标准实践可以让其他人更容易理解您的代码,或者在某些内容无法按预期工作时帮助您.

您的代码已经遵循常见的gem目录布局,不需要在那里进行任何更改.但是,作为一般经验法则,您应该使用require来加载“libraries”和require_relative(如果您使用Ruby> 1.9)来加载相对于您正在处理的源文件.

1)您的文件test_foo.rb应该只包含一行:

require 'foo'

那就是省略require路径中的’./lib’部分. gem的入口点(“require_path”)通常选择为“lib”.稍后再详述(3).

2)接下来,在foo.rb中,使用require_relative(再次假设Ruby 1.9)来提取相关的源文件:

require_relative 'foo/file1'
require_relative 'foo/file2'

3)要将gem的require_path设置为lib,添加gemspec文件被认为是一种好习惯.

要测试代码(例如使用test_foo.rb),您有以下几种选择:

4)您可以使用ruby的-I选项运行test_foo.rb,以在其加载路径中包含lib /目录:

ruby -I lib test_foo.rb

这比直接在代码中添加其他包含更不突兀.

5)Bundler是一种更好的方法来管理您的代码/宝石,以便在“真实”条件下进行测试,特别是如果您一次开发两个或多个相互依赖的宝石. Bundler为您提供了在本地引用这些gem的选项,因此无需正式部署它们以便在开发期间测试它们的功能.要使用Bundler,您需要将Gemfile添加到gem代码的根目录中.

6)最后,为方便起见,将开发过程中的常用步骤集成到Rakefile中是有意义的,使用rake来驱动进程.

我在我自己的项目中使用了这些技术,这里有一些链接供你参考,给你一些具体的例子:

1)Test files just contain a “require ‘foo'”

2)Use “require_relative” from your “main” file to pull in subsequent parts

3)Example gemspec with require_path set to “lib”

5)Example Gemfile

6)Example Rakefile

当然你不需要使用所有这些技术,你可能会使用步骤1-4,但随着你的项目变得越来越大,额外的努力肯定会得到回报.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读