2011-01-04 38 views
6

Đây là cách tôi phát hiện git trong ruby:cách Nền tảng độc lập phát hiện nếu git được cài đặt

`which git 2>/dev/null` and $?.success? 

Tuy nhiên, đây không phải là cross-platform. Nó không thành công trên các hệ thống không unix hoặc những người không có lệnh which (mặc dù tôi không chắc chắn những gì đang có).

Tôi cần một cách để phát hiện git thỏa mãn các điều kiện:

  1. tác phẩm đáng tin cậy cross-platform, ngay cả trên Windows
  2. không làm bất cứ điều gì ra đến $ stdout hoặc $ stderr
  3. lượng nhỏ mã

cập nhật: giải pháp là để tránh sử dụng hoàn toàn which và chuyển hướng đầu ra tới NUL trên Windows.

require 'rbconfig' 
void = RbConfig::CONFIG['host_os'] =~ /msdos|mswin|djgpp|mingw/ ? 'NUL' : '/dev/null' 
system "git --version >>#{void} 2>&1" 

Các system lệnh trả về đúng trên thành công và sai về thất bại, tiết kiệm cho chúng tôi các chuyến đi đến $?.success? đó là cần thiết khi sử dụng backticks.

+0

lẽ http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby/ 2108757 # 2108757 có thể giúp bạn? – VonC

+0

Hãy tha thứ cho sự ngu xuẩn tiềm ẩn của tôi, nhưng không phải là 'cái gì' viết cho sự kiệt sức? –

+0

@Steven: tất nhiên là có, nhưng trong chính vỏ bọc của nó, và bạn có thể thấy rằng tôi đã sử dụng backticks để thu được đầu ra đó trong một giá trị trả về mà sau đó tôi loại bỏ. Nếu 'which' đã viết gì đó cho STDERR, ruby ​​sẽ chuyển tiếp tới $ stderr của chương trình chính (cái gì đó tôi không muốn xảy ra) vì vậy tôi đã sử dụng' 2>/dev/null' để xử lý điều đó. – mislav

Trả lời

4

Không có điều nào như /dev/null trên Windows.

Một cách tiếp cận chúng tôi đã được tham gia vào các dự án khác nhau là xác định NULL dựa trên RbConfig::CONFIG['host_os']

NULL = RbConfig::CONFIG['host_os'] =~ /mingw|mswin/ ? 'NUL' : '/dev/null' 

Sau đó sử dụng để chuyển hướng cả stdout và stderr với nó.

Đối với đó, tôi đã thực hiện một tham chiếu tầm thường trên my blog

Nhưng, nếu bạn chỉ muốn kiểm tra sự hiện diện git và không phải vị trí, không cần phải làm đó, với một cuộc gọi hệ thống đơn giản và kiểm tra các kết quả $? sẽ là đủ.

Hope this helps

+0

Khi tôi gọi 'git' và sau đó kiểm tra' $ ?. success? ', Kết quả luôn đúng, ngay cả khi git chưa được cài đặt. (ruby 1.9.2, i686-pc-mingw32 trên Win XP) – mislav

+1

https://gist.github.com/765328 –

+0

BTW, đã sử dụng kỹ thuật này với trình biên dịch cào để phát hiện gmake/make trên các nền tảng: https: // github.com/luislavena/rake-compiler/blob/master/lib/rake/extensiontask.rb#L352-354 –

0

lẽ chạy trên JRuby và sử dụng JGit có thể là một lựa chọn để thực sự đi nền tảng độc lập.

+0

nhưng 'cái nào' sẽ không chạy trên cửa sổ. Các prob. không phải là tính di động của ruby. – zengr

+0

@zengr: Ý tưởng sẽ không sử dụng thực thi git bản địa chút nào, nhưng JGit, một thực thi Java thuần túy của git. –

+0

nhưng nếu người dùng cuối đang sử dụng git (và không phải jgit), nó sẽ không bị phát hiện và ứng dụng OPs sẽ cài đặt jgit WITH git đã có trên máy. – zengr

1

này là một giải pháp tránh được việc bắn phá để phát hiện các tệp thi hành và cũng có thể phát hiện đáng tin cậy vị trí thực thi. Đó là một thay thế cho which.

def which cmd 
    exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] 
    ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| 
    exts.each { |ext| 
     exe = "#{path}/#{cmd}#{ext}" 
     return exe if File.executable? exe 
    } 
    end 
    return nil 
end 

Cách sử dụng:

# Mac OS X 
where 'ruby' 
#=> /opt/local/Cellar/ruby-enterprise-edition/2010.02/bin/ruby 

# Windows 
where 'ruby' 
#=> C:\Program Files\Ruby192\bin/ruby.exe 
Các vấn đề liên quan