测试当前目录是否在Rails项目中(bash)

时间:2012-04-05 06:25:10

标签: ruby-on-rails bash

有没有一种简单的方法来测试当前目录是否在rails项目中?很明显,Rails本身测试这个是为了使用rails子命令(generate,scaffold等),所以可能有一种直接的方法来测试它。

我正在寻找类似于test if you're inside a Git repo的方式。

3 个答案:

答案 0 :(得分:4)

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

假设你正在使用Bundler:

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

这就是该片段的作用:

  1. 在当前目录中为'rails'创建Gemfile。丢弃grep的输出。
  2. 如果grep以退出代码0退出,则表示您正在使用Rails项目
  3. 如果当前目录中不存在名为“Gemfile”的文件,

    grep 'rails' 'Gemfile'将返回状态代码2。 grep如果找到'Gemfile'但它不包含'rails',将返回状态代码1。

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

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

    所有这一切都是测试脚本/ rails文件是否存在。

    我希望这可以帮助那些希望用bash代替红宝石的人。

答案 1 :(得分:1)

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

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

bundle list | grep 'rail'

答案 2 :(得分:0)

经过进一步调查,我能够深入了解rails命令本身并基于railties gem(<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