Rails API项目执行rake secret报错:未知任务‘secret’求助
rake secret和credentials任务 我正在开发一个仅API的Rails应用,用Devise实现用户认证,配置devise-jwt时执行rake secret命令报错:
rake aborted! Don't know how to build task 'secret' (See the list of available tasks with
rake --tasks)
查看可用任务列表,secret任务不存在;我知道secrets命令已被credentials替代,但这个任务也不在可用列表里,可Rails文档显示这些任务应该存在。
我的Gemfile内容(不含默认注释的gem):
ruby "3.3.0" gem "rails", "~> 7.1.2" gem "sqlite3", "~> 1.4" gem "puma", ">= 5.0" gem "tzinfo-data", platforms: %i[ windows jruby ] gem "bootsnap", require: false gem "nokogiri" gem "open-uri" gem "devise" gem "devise-jwt" gem 'jsonapi-serializer' group :development, :test do gem "debug", platforms: %i[ mri windows ] gem "pry-byebug" end group :development do gem "annotate", git: 'https://github.com/ctran/annotate_models.git' end
排查操作及结果:
$ rake secret rake aborted! Don't know how to build task 'secret' (See the list of available tasks with `rake --tasks`) $ bundle exec rake -T | grep secret (no output) # 执行bundle exec rake -T后,列出的任务中无secret/credentials相关项
请问我哪里操作有误?是Rails安装出问题了吗?
1. 用rails命令替代rake
从Rails 5开始,多数rake任务已迁移到rails命令,secret任务就是其中之一,你应该执行:
bundle exec rails secret
而非rake secret。
2. API-only应用默认隐藏Credentials相关任务
Rails的API-only模式会默认排除非必要的railties,Credentials相关模块就在其中。如果需要使用credentials系列任务,需在config/application.rb中手动引入对应的railtie:
# config/application.rb require_relative "boot" require "rails" # 添加此行引入Credentials railtie require "rails/commands/credentials/credentials_command" # 保留API-only所需的核心railties require "active_model/railtie" require "active_job/railtie" require "active_record/railtie" require "active_storage/engine" require "action_controller/railtie" require "action_mailer/railtie" require "action_mailbox/engine" require "action_text/engine" require "action_view/railtie" require "action_cable/engine" # require "sprockets/railtie" require "rails/test_unit/railtie" # 其余代码保持不变
添加后即可正常使用bundle exec rails credentials:edit等命令。
3. Rails安装无异常
从你列出的可用任务来看,数据库操作等核心Rails任务都存在,说明Rails安装正常,只是API-only模式的默认配置隐藏了部分非核心任务。
关于devise-jwt的配置
配置devise-jwt所需的密钥,直接用rails secret生成即可,可将密钥存入环境变量或credentials中,无需纠结rake任务的问题。
内容的提问来源于stack exchange,提问作者mirando

