gpt4 book ai didi

ruby - Bundler:为什么它在 require "bundler/setup"上读取 gemspec?

转载 作者:数据小太阳 更新时间:2023-10-29 08:52:39 25 4
gpt4 key购买 nike

标题就是问题,这里是提示它的上下文。

gem 文件:

source "http://rubygems.org"

# Specify your gem's dependencies in the gemspec
gemspec

这是 rackup 文件的顶部:

require 'rubygems'
require "bundler/setup"

在运行 rackup 文件时抛出一个错误:

<module:Rack>': GemName is not a class (TypeError)

为什么?因为我在写一个Rack中间件,标准布局是:

lib/
rack/
gem_name.rb
gem_name/
version.rb

gem_name.rb 将包含:

module Rack
class GemName

version.rb 将包含:

module Rack
module GemName
VERSION = "0.0.1"

最后,gem_name.gemspec 将包含:

require "rack/flash-in-the-pan/version"
#...
s.version = Rack::GemName::VERSION

用相同的名称命名模块和类不是问题只要您不同时需要这两个文件。 通常,这不会发生,因为您要么需要用于构建 gem 的版本,要么需要运行 gem 库,因此只需要其中之一。

但是,这次我决定使用 Bundler 来管理 gem 的依赖项。当通过 bundler 需要 gem 库时,它显然也会运行 gemspec。我可以很容易地“修复”它,我在 gemspec 中手动定义版本号。

回到我的问题 - 为什么 Bundler 需要在库的运行时查看 gemspec?

bundler (1.0.21)

非常感谢任何见解。

最佳答案

无论何时运行 bundler,它都必须解析 Gemfile 以实际找出需要加载的 gem,必须将什么添加到 $LOAD_PATH 等等。作为其中的一部分,它必须解析 gemspec

Gemfile.lock 包含所有 gem 的信息以及用于节省启动时间的依赖项,但它并没有减少解析 Gemfile 的需要。

您可以通过多种方式解决这个问题。两个简单的方法是使用 File.read 和一些正则表达式来提取版本。或者需要 gem_name.rb 和 gem_name/version.rb 文件。

关于ruby - Bundler:为什么它在 require "bundler/setup"上读取 gemspec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9028618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com