在 ruby 的 do 块中调用方法
Calling a method inside a do block in ruby
我正在尝试将来自所有 git 子模块的文件包含在一个 gemspec 文件中。
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
但是在 do 块中,我得到
Invalid gemspec in [nameofgem.gemspec]: undefined method `getSubmoduleFiles' for Gem::Specification:::Module
我做错了什么?为什么不能从 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
为什么这是必要的,为什么在万维网上似乎没有其他人问过或回答过这个问题,我一点也不知道,但我们开始吧。
我正在尝试将来自所有 git 子模块的文件包含在一个 gemspec 文件中。 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
但是在 do 块中,我得到
Invalid gemspec in [nameofgem.gemspec]: undefined method `getSubmoduleFiles' for Gem::Specification:::Module
我做错了什么?为什么不能从 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
为什么这是必要的,为什么在万维网上似乎没有其他人问过或回答过这个问题,我一点也不知道,但我们开始吧。