5

有没有一种简单的方法来测试当前目录是否在 rails 项目中?显然,Rails 本身对此进行了测试,以便使用 rails 子命令(生成、脚手架等),因此大概有一种直接的方法来测试它。

我正在寻找类似于如果您在 Git repo 中进行测试的方法。

4

3 回答 3

5

我知道你已经有了 ruby​​ 的解决方案,但这里有一个用 bash 编写的,应该会快一点。

假设您使用的是 Bundler:

grep 'rails' 'Gemfile' >/dev/null 2>&1
if [ $? -eq 0 ]; then
  echo "It's a Rails project!"
fi

这就是该片段的作用:

  1. grep 当前目录中的 Gemfile 以获取“rails”。丢弃 grep 的输出。
  2. 如果 grep 以退出代码 0 退出,则您在 Rails 项目中

grep 'rails' 'Gemfile'如果当前目录中不存在名为“Gemfile”的文件,将返回状态码 2。grep如果找到“Gemfile”但不包含“rails”,将返回状态码 1。

对于没有 Bundler 的 Rails 2,这应该可以工作:

if [ -f script/rails ]; then
  echo "It's a Rails 2 project!"
fi

所做的只是测试脚本/rails 文件是否存在。

我希望这对希望使用 bash 而不是 ruby​​ 的人有所帮助。

于 2013-09-29T23:25:42.443 回答
1

没有特定于 Rails 的文件或目录。所以你不能真正知道你是否在 rails 目录中。

更好的解决方案是了解您的 Gemfile 中是否有 rails 或 railities gem 依赖项。

bundle list | grep 'rail'
于 2012-04-05T07:57:59.073 回答
0

经过进一步调查,我能够深入研究rails命令本身并基于部分railtiesgem ( <railties>/lib/rails/script_rails_loader.rb) 的解决方案:

#!/usr/bin/env ruby

require 'pathname'

SCRIPT_RAILS = File.join('script', 'rails')

def self.in_rails_application?
  File.exists?(SCRIPT_RAILS)
end

def self.in_rails_application_subdirectory?(path = Pathname.new(Dir.pwd))
  File.exists?(File.join(path, SCRIPT_RAILS)) || !path.root? && in_rails_application_subdirectory?(path.parent)
end

if in_rails_application? || in_rails_application_subdirectory?
  exit(0)
else
  exit(1)
end
于 2012-04-06T22:28:12.363 回答