如何解决Ruby Gem 项目——Thor 生成器导致只读文件系统错误
作为一个个人项目,我决定编写一个缩小版的 Ruby on Rails,并使用名为 apt remove openjdk-16-headless -y
apt install openjdk-16 -y
OR
apt install default-jdk default-jre -y
的 Bundle 将其作为 gem 上传。
在我的项目中,我希望实现一个类似于 railz_lite
的生成器,它可以为网络应用创建必要的文件夹,即控制器/、视图/、模型/等。
为此,我将 Thor 作为依赖项包含在内,然后创建了以下文件:
rails new
在 gem 项目的根文件夹中,当我运行 require 'thor/group'
module RailzLite
module Generators
class Project < Thor::Group
include Thor::Actions
def self.source_root
File.dirname(__FILE__) + "/templates"
end
def add_controllers
empty_directory("controllers")
end
def add_models
empty_directory("models")
end
def add_server
template("server.rb","config/server.rb")
end
def add_views
empty_directory("views")
end
def add_public
empty_directory("public")
end
end
end
end
时,生成器工作正常,并且创建了必要的文件。
但是,如果我创建一个新项目,将我的 gem (railz_lite) 放在 Gemfile 中,运行 bundle install,然后执行 bundle exec railz_lite new
,我会遇到以下错误:
bundle exec rails_lite new
我怀疑错误是因为 .rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:232:in `mkdir':
: Read-only file system @ dir_s_mkdir - /controllers (Errno::EROFS)
命令不是指我刚刚创建的项目的根目录。我希望有一个简单的方法来解决这个问题。
为了进一步参考,CLI 脚本和类如下所示:
railz_lite
empty_directory
cli.rb
#!/usr/bin/env ruby
require 'railz_lite/cli'
RailzLite::CLI.start
任何解决方案将不胜感激!
注意:我在 macOS Catalina 上运行它。
解决方法
所以我在通过 gem 论坛广泛搜索并查看 Rails 源代码后找到了一个解决方案。
在生成内部,我必须手动将 destination_root 设置为项目的工作目录。可以通过 Dir.pwd
require 'thor/group'
module RailzLite
module Generators
class Project < Thor::Group
include Thor::Actions
def self.source_root
File.dirname(__FILE__) + "/templates"
end
def self.destination_root # this method fixes the problem!
Dir.pwd # get the current project directory
end
def add_controllers
empty_directory("controllers")
end
def add_models
empty_directory("models")
end
def add_server
template("server.rb","config/server.rb")
end
def add_views
empty_directory("views")
end
def add_public
empty_directory("public")
end
end
end
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。