例如,我正在开发一个gem,在开发时,我使用pryIRB代替IRB,并debugger进行调试。但是,我不希望可能的贡献者必须安装它们(因为他们可能不需要它们)。我的第一个想法是将它们放入 Bundler 组中:
source :rubygems
gemspec
group :extras do
gem "pry"
gem "debugger"
end
Run Code Online (Sandbox Code Playgroud)
然后人们可以使用:
$ bundle install --without extras
Run Code Online (Sandbox Code Playgroud)
但我希望它是默认的,它们没有安装。完美的是它们不在我的中Gemfile,但我仍然可以需要它们(如果它们存在于计算机上)。这个解决方案应该没问题,因为我不在乎它们被锁定在哪个版本。能做到吗?
我有一个代表集合的类.我将Enumerable模块包含在其中并定义了方法#each,以便我获得所有方法.
但问题是,Enumerable方法不能保持同一类.所以,例如,如果我的类被命名Collection,如果我这样做Collection#select,我希望结果的类也是Collection(而不是Array).有没有办法如何实现这一目标?
我正在围绕CLI创建一个Ruby包装器.我发现了一个简洁的方法Open3.capture3(内部使用Open3.popen3),它允许我执行命令并捕获stdout,stderr和退出代码.
我想要检测的一件事是,是否找不到CLI可执行文件(并为此引发特殊错误).我知道UNIX shell 127在找不到命令时会提供退出代码.当我$ foo在bash中执行时,我得到了-bash: foo: command not found,这正是我想要显示的错误消息.
考虑到所有这些,我编写了这样的代码:
require "open3"
stdout, stderr, status = Open3.capture3(command)
case status.exitstatus
when 0
return stdout
when 1, 127
raise MyError, stderr
end
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时command = "foo",我收到一个错误:
Errno::ENOENT: No such file or directory - foo
/Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:193:in `spawn'
/Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:193:in `popen_run'
/Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:93:in `popen3'
/Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:252:in `capture3'
Run Code Online (Sandbox Code Playgroud)
为什么会出现此错误?我以为Open3.capture3应该直接在shell中执行该命令,为什么我不能得到正常的STDERR并退出代码127?
我正在制作一个自定义生成器,生成一个新的rails应用程序,我这样做
require 'thor'
require 'rails/generators/rails/app/app_generator'
class AppBuilder < Rails::AppBuilder
include Thor::Actions
include Thor::Shell
...
end
Run Code Online (Sandbox Code Playgroud)
问题是,我如何添加一个新的源目录(然后使用Thor::Actions#copy_file,Thor::Actions#template,和其他人)?我在Thor的文档中看到了Thor::Actions#source_paths保存源代码(它是一个路径数组),所以我尝试在我的课程中覆盖它(因为我已经包括在内Thor::Actions):
def source_paths
[File.join(File.expand_path(File.dirname(__FILE__)), "templates")] + super
end
Run Code Online (Sandbox Code Playgroud)
有了这个,我想./templates在源代码中添加目录,同时仍然保持Rails的一个(这就是+ super最后的原因).但它不起作用,它仍然将Rails的源路径列为唯一的路径.
我尝试浏览Rails的源代码,但我找不到Rails如何将他的目录放在源路径中.我真的想知道:)
我想实现一个(类)方法attr_accessor_with_client_reset,它执行相同的操作attr_accessor,但是在它另外执行的每个编写器上
@client = nil
Run Code Online (Sandbox Code Playgroud)
所以,例如,
attr_accessor_with_client_reset :foo
Run Code Online (Sandbox Code Playgroud)
应该产生相同的结果
attr_reader :foo
def foo=(value)
@foo = value
@client = nil
end
Run Code Online (Sandbox Code Playgroud)
我该如何实现这一目标?
我正在做Rails应用程序,人们可以在这里进行测验.我有一个模型BrowserGame正在处理控制器逻辑(会话,重定向等).目前,这是我的#initialize方法:
class BrowserGame
def initialize(controller)
@controller = controller
end
end
Run Code Online (Sandbox Code Playgroud)
在控制器中我有一个方法
class GamesController < ApplicationController
# actions
private
def browser_game
BrowserGame.new(self)
end
end
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我将整个控制器传递给BrowserGame#initialize(因此我可以使用会话和其他人操作).这是一个好主意吗?是否有任何副作用,因为控制器实例是一个大对象?
我正在开发一个gem,我的Gemfile看起来像这样:
source :rubygems
gemspec
group :development, :test do
gem "pry"
gem "debugger"
gem "rake"
end
Run Code Online (Sandbox Code Playgroud)
但是,我不希望人们必须安装pry和debugger运行测试,但我也希望能够在我的测试中要求它们(因为我正在运行带有前缀的测试bundle exec,我无法在我的加载路径中获取它们如果他们不在Gemfile中).我该如何实现这一目标?
另外,何时将用于开发的宝石放在gemspec中,何时将它们放入Gemfile中?我真的不知道区别.
我有一个包含国家/地区文件夹的目录,其中可能存在具有双重名称的文件夹:
en_en es_es fr_fr de_de
Run Code Online (Sandbox Code Playgroud)
我写了一个脚本来删除重复:
for code in en de es fr it nl pt tr; do
if [[ -d $code_$code ]]; then
mv "${code}_${code}" "${code}"
fi
end
Run Code Online (Sandbox Code Playgroud)
但它不起作用 - if永远不会执行代码(我也试过放在echo那里).但是,以下工作:
if [[ -d es_es ]]; then
echo "foo"
end
Run Code Online (Sandbox Code Playgroud)
我正在使用(日志)bash 3.2.
当我尝试为我的 Google 帐户创建密钥时,我惊讶地发现它知道我的密钥存储在哪里(1Password、iCloud 钥匙串、安全密钥等)。
现在,我已经研究 WebAuthn 协议一段时间了,甚至查看了协议扩展,但我找不到任何方法来获取有关用户注册的密钥类型的信息。
WebAuthn 支持吗?我认为这将是一个很好的替代方案,可以替代要求用户为其密钥提供昵称的方法。