微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ruby Gem 项目——Thor 生成器导致只读文件系统错误

如何解决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 举报,一经查实,本站将立刻删除。