【问题标题】:Is it possible to have my gem write to it's root gem directory?是否可以让我的 gem 写入它的根 gem 目录?
【发布时间】:2018-03-21 04:55:00
【问题描述】:

我正在尝试通过写入 gem 中包含的文件来改进我的 gem 的收藏夹功能。我当前的版本可以工作,但它要求用户在当前工作目录中有创建的文件才能工作。

我目前正在使用FileUtils 来编写文件,但不知道是否 1. 这甚至可能认为可能会有权限问题和 2. 如果有可能如何在不同平台上成功设置路径目标和环境。

当前代码:在我的可执行文件中

#creator    
if !File.exist?('usr')

  FileUtils::mkdir 'usr'

  FileUtils::touch 'usr/favorites.txt'

end


#writer
File.open("../ruby_doc_favorites.txt", "a"){|l| l.puts "some string"}

我想要...

File.open("[dynamic_path_to_gem_directory]", "a"){|l| l.puts "some string"}

【问题讨论】:

  • 我 - 作为 gem 用户 - 如果我有更改配置文件的存储位置或至少在我的主目录中拥有该数据,我更愿意这样做。并且不要与 gem 本身文件夹中同一台机器上的所有其他用户共享其数据。此外,gem 的文件(我认为它的源代码)在下载后不应更改。我的建议是将 gem 与其数据分开。
  • 我同意 spickermann - 你要实现的目标看起来很不合适。如果您要为 gem 建立某种数据库,用户应该能够手动设置该文件的路径,因此如果他重新安装 gem,数据将保持不变。或者,如果您只需要一个临时文件,您可以改用Tempfile
  • 另外值得注意的是,在某些情况下写入 gem 目录可能不起作用,例如用户运行系统 Ruby 安装,其中 gem 是由 root 安装的。

标签: ruby rubygems rvm filepath


【解决方案1】:

获取 gem 文件夹的一种方法如下:

def gem_folder(gem_name, version)
  "#{Gem.path[1]}/gems/#{gem_name}-#{version}"
end

每次更改 gem 时都需要更改版本,但您可能已经这样做了。

不幸的是,我不能保证这可以跨平台工作。

例子:

gem_folder('pry', '0.11.3')
# => "/Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.11.3"

# check find_files as a reference
Gem.find_files("pry")[0]
# => "/Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.11.3/lib/pry.rb"

您可以对 gem 的 gem 名称和版本进行硬编码。

【讨论】:

  • awesome 会试一试并返回反馈,我在 .rvm 中看到了这一点,想知道是否可以做一些正则表达式的事情,但也注意到 rvm 为每个 ruby​​ 版本保存单独的文件夹。例如,如果我在 2.3.3 上安装我的 gem,它将位于 ~/.rvm.......ruby 2.3.3@global 等如果安装在另一个上,则该版本文件夹可能是另一个障碍,但非常感谢,会在几分钟内试一试:)
  • 更新:由于我上面提到的 ~/.rvm/gems/ruby-2.3.3/gems/ruby_doc-2.5.0 这是我的 gem 目录的当前路径,这不起作用,我假设如果有人只有一个版本的 ruby​​,这将是文件小路。将删除和测试,也许可以在其中添加一些条件语句并添加两个文件路径模式,但是,我必须弄清楚 ruby​​ x.x.x 部分?
  • Gem.path 不给你当前的 rb 版本吗?
  • 嗯,很奇怪...是的,很抱歉,我在那里提供了我想要的东西但没有用,让我清理并重试..返回反馈和当前代码
  • 不用担心...许多程序会在主目录中创建一个隐藏文件夹,您无法使用Dir.home 获得该文件夹。我个人有 20 个使用各种程序创建的隐藏文件夹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2012-09-20
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2021-04-27
相关资源
最近更新 更多