【问题标题】:Opening relative paths from gem从 gem 打开相对路径
【发布时间】:2017-02-07 11:40:19
【问题描述】:

我正在编写一个简单的 gem,它可以从文本文件和 zip 档案中加载和保存数据。因此,它有四种方法:分别为load_from_fileload_from_zipsave_to_filesave_to_zip。问题是我不知道如何为这些方法指定加载和保存的相对路径。他们来了:

def load_from_file(filename)
  File.open(filename) do |f|
    f.each { |line| add(line) } # `add` is my another class method
  end
end

def load_from_zip(filename)
  Zip::File.open("#{filename}.zip") do |zipfile|
    zipfile.each { |entry| read_zipped_file(zipfile, entry) } # my private method
  end
end

def save_to_file(filename)
  File.write("#{filename}.txt", data)
end

def save_to_zip(filename)
  Zip::File.open("#{filename}.zip", Zip::File::CREATE) do |zipfile|
    zipfile.get_output_stream('output.txt') { |f| f.print data }
  end
end

private

def read_zipped_file(zipfile, entry)
  zipfile.read(entry).lines.each { |line| add(line) }
end

所以我想要的基本上是允许这个gem通过系统中使用的相对路径加载和保存文件,例如我有一个位于 /home/user/my_app 的应用程序,其中包含两个文件 - app.rbdata.txt,我可以在不指定绝对路径的情况下从此目录中读取文件。

例子:

# app.rb
require 'my_gem'

my_gem = MyGem.new
my_gem.load_from_file('data.txt')

(抱歉英语不好)

UPD:这不是 Rails gem,我没有使用 Rails。这一切都只是纯粹的 Ruby。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    简答

    如果我理解正确,您无需更改任何内容。

    app.rb 和你的gem 内部,相对路径将相对于Dir.pwd 被理解。

    如果你从/home/user/my_app 内部运行ruby app.rb

    • Dir.pwd 将是 /home/user/my_app
    • app.rbmy_gem 都会在 /home/user/my_app 中查找 'data.txt'

    有用的方法,以防万一

    目录.chdir

    如果由于某种原因 Dir.pwd 不是所需的文件夹,您可以 change directory

    Dir.chdir('/home/user/my_app') do
      # relative paths will be based from /home/user/my_app
      # call your gem from here
    end
    

    获取当前文件目录:

    __dir__会帮你获取目录:

    返回文件目录的规范化绝对路径 从中调用此方法。

    获取当前文件:

    __FILE__ 将返回当前文件。 (注:uppercase。)

    连接文件路径:

    如果您需要连接文件路径,请使用File.expand_pathFile.join。请不要连接字符串。

    如果您不相信相对路径会被正确解析,您可以向您的方法发送绝对路径:

    my_gem.load_from_file(File.expand_path('data.txt'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多