在 ruby 中的 do 块内调用方法



我正在尝试将所有 git 子模块中的文件包含在 gemspec 文件中。宝石规格如下

require File.expand_path(File.dirname(__FILE__)) + '/lib/nameofgem.rb'
# Gets all files, from all submodules, and returns them
# as an array
def getSubmoduleFiles()
  files = []
  # get an array of submodule dirs by executing 'pwd' inside each submodule
  `git submodule --quiet foreach pwd`.split("n").each do |submodule_path|
    gemRootDir = File.dirname(File.expand_path(__FILE__))
    # for each submodule, change working directory to that submodule
    Dir.chdir(submodule_path) do
      submodule_files = getSubmoduleFiles()
      # issue git ls-files in submodule's directory
      submodule_files + `git ls-files`.split("n")
      puts "found:"
      puts submodule_files.to_s
      puts
      # prepend the submodule path to create absolute file paths
      submodule_files_fullpaths = submodule_files.map do |filename|
        "#{submodule_path}/#{filename}"
      end
      # remove leading path parts to get paths relative to the gem's root dir
      # (this assumes, that the gemspec resides in the gem's root dir)
      submodule_files_paths = submodule_files_fullpaths.map do |filename|
        filename.gsub "#{gemRootDir}/", ""
      end
      # add relative paths to gem.files
      files += submodule_files_paths
    end
  end
  return files
end
Gem::Specification.new do |s|
  s.name        = 'name'
  s.version     = "1.1.1"
  s.executables << 'exec'
  s.licenses    = ['LICENCE']
  s.summary     = "Does stuff"
  s.description = "Longer description of stuff"
  s.authors     = ["author"]
  s.email       = 'my@email'
  s.files       = `git ls-files -- lib/*`.split("n")
  s.homepage    = 'https://example.com/'
  s.required_ruby_version = '>= 2.0.0'
  s.files += getSubmoduleFiles()
end

但是在做块中,我得到了

[nameofgem.gemspec] 中的 gemspec 无效:Gem::Specification::Module 的未定义方法 'getSubmoduleFiles'

我做错了什么?为什么不能从 do 块中调用函数?

似乎 gemspec 文件在范围界定和命名空间方面做了一些奇怪的事情(在整个文件中,不仅仅是在 gemspec 块本身内),但是在将我的头撞在桌子上 15 分钟并喝下另一杯啤酒以减轻因我无法在 gemspec 中调用函数而引起的存在主义折磨之后, 我想出了一个相当干净的解决方案:只需在定义和调用中将self.放在函数名称的前面,如下所示:

def self.foo
  puts 'It works :)'
end
Gem::Specification.new do |s|
  # ...
  self.foo  # should print 'It works :)' instead of erroring out
  # ...
end

为什么这是必要的,为什么似乎没有其他人在万维网上的任何地方问或回答这个问题,我没有最微弱的想法,但我们开始了。

相关内容

  • 没有找到相关文章

最新更新