2014-12-26 4 views
2

제가 특정 보석을 설치하지 않았다면, "oj"라고 해 봅시다. 다음 작업을 수행하면 보석이 설치되고 끝에 Gem.find_files이 설치되어있는 경로를 반환합니다.`Gem.find_files`는 그 자체와 상호 작용합니다

require "open3" 
name = "oj" 
_, out, err, thread = Open3.popen3("sudo gem install #{name}") 
thread.join 
puts out.read, err.read 
p Gem.find_files(name) 

그러나, 나는 마지막에 같은 전화의 발생 전에 Gem.find_files(name)의 추가 라인을 가지고 다음, 상기 다음

require "open3" 
name = "oj" 
if Gem.find_files(name).empty? 
    _, out, err, thread = Open3.popen3("sudo gem install #{name}") 
    thread.join 
    puts out.read, err.read 
    p Gem.find_files(name) 
end 

Gem.find_files을 (보석을 제거하고) 실행하는 경우 end는 빈 배열을 반환합니다. Gem.find_files (설치 전)의 첫 번째 호출은 Gem.find_files (설치 후)의 두 번째 호출이 빈 배열을 반환하는 것으로 보입니다.

  • 왜 빈 배열을 반환합니까?
  • Gem.find_files 중 하나 또는 두 번을 수정하여 첫 번째 (설치 전)가 빈 배열을 반환하고 후자의 배열 (포함 된 후)이 포함 된 경로를 반환하도록하려면 어떻게해야합니까?

답변

1

처음으로 find_files으로 전화 할 때 보석 코드는 현재 보석 사양 및 해당 디렉토리를 포함하여 많은 정보를 캐시합니다.

두 번째로 find_files으로 전화를 걸면 보석 코드는 동일한 캐시 정보를 사용하므로 새로운 보석이 추가 된 것을 알 수 없습니다.

Gem::Specification.reset 
:

이 솔루션은 다음과 같이 캐시를 재설정, 새로운 보석을 설치하다