전역 소스 추가

4487 단어 bundler
4

묘사

저는 보석의 판매 장소를 더욱 유연하게 정하기 위해 GlobSource(또는 유사한 물건)를 추가하는 것을 권장합니다.이것은 현재의 판매자 glob가 지나치게 급진적인 상황에서 매우 유용하다.나에게 필요한 원형이 하나 있다. 바로bahuvrihi/bundler@b65479084c09346ca36ab3dc0ef58cc86b037dc6

용례


나는 두 환경의 의존 관계를 처리하기 위해 bundler를 설정할 때 이런 상황을 만났다. 하나는 내가 의존 관계를 복원하는 것이고, 다른 하나는 더 좋은 용어가 부족하기 때문에, 나는 부동하는 의존 관계를 만났다.몇 개의 보석을 동시에 개발하고 모든 보석의 최신 제출과 끊임없이 집적하려고 할 때 후자가 나타난다.
예를 들어, 로컬에서 개발한 종속 항목의 고정 버전은 다음과 같습니다.
gem_b
|- gem_b.gemspec
|- submodule
|  `- gem_a                    # 'fixed' version of gem_a
|     `- gem_a.gemspec
|
`- vendor
   `- gems
      `- environment.rb        # load_path like 'submodule/gem_a/lib'
그런 다음 CI 서버(예: Cruise Control)에서 종속 항목에 대한 최신 커밋을 테스트합니다.
projects
|- gem_a                       # Represents the most recent commit for gem_a
|  `- work
|     `- gem_a.gemspec
|
`- gem_b
   `- work
      |- gem_b.gemspec
      |- submodule
      |  `- gem_a              # This might be present but it doesn't get used!
      |     `- gem_a.gemspec
      |
      `- vendor
         |- gems
         `- environment.rb     # load_path like 'projects/gem_a/work/lib'
이 경우 파일에는 다음과 같은 컨텐트가 있습니다.
if ENV['BUNDLE_CC'] == "true"

  # in the CC environment, set floating dependencies
  # by globing for gemspecs in the work directories...
  # notice that unlike a regular DirectorySource, this
  # will not pickup the submodule dependency at
  # 'gem_b/work/submodule/gem_a/gem_a.gemspec',

  cc_dir = ENV['CRUISE_DATA_ROOT'] || File.dirname(__FILE__) + "/../../.."
  glob_source cc_dir, "projects/*/work/*.gemspec"
else

  # under normal circumstances, set fixed
  # dependencies by globing submodule

  glob_source File.dirname(__FILE__), "submodule/*/*.gemspec"
end

다른 용례


또 하나의 좋은 사용 사례는 Gempec 파일을 바탕으로 Gemfile 의존 관계를 구축할 수 있다는 것이다. 본질적으로 작업 디렉터리를 제공하는 것이다.
[gem_a.gemspec]
Gem::Specification.new do |s|
  s.name = "a"
  s.version = "0.0.1"

  s.add_dependency("rack", "= 1.0.0")
end

[Gemfile]
spec = eval(File.read('gem_a.gemspec'))
gem "#{spec.name}", "#{spec.version}"

if ENV['BUNDLE_CC'] == "true"
  cc_dir = ENV['CRUISE_DATA_ROOT'] || File.dirname(__FILE__) + "/../../.."
  glob_source cc_dir, "projects/*/work/*.gemspec"
else

  # Note the change here, the additional pattern
  # picks up the gem_a.gemspec in the working directory

  glob_source File.dirname(__FILE__), "*.gemspec", "submodule/*/*.gemspec"
end

토론 #1

그래서 두 번째 용례는 곤혹스러웠지만, 디렉터리에 glob을 추가하는 것은 좋은 생각이라고 생각합니다.나는 0.7.0에 유사한 내용을 추가할 것이다.디렉터리 '/path/to/dir',:glob=> '/work/.gempec' 같은 것일 수도 있습니다

토론 #2

좋은 소식.
나의 두 번째 사례를 읽으면 어쩐지 사람을 곤혹스럽게 한다.만약 네가 흥미가 있다면, 여기에 더 좋은 해석이 하나 있다...사실은 그것이 매우 유용하다는 것을 증명한다.

용례(두 개 시도)


핵심 사상은 나의 의존항을 한 번만 열거하고 싶다는 것이다. 나는 수동으로 나의 gmpec 파일을 관리하기 때문에 나는 정말로 나의 gmpec 파일에서 나의 의존항을 관리하고 싶다.
이를 위해, 나는 파일에 어떠한 의존항도 열거하지 않을 것이다.반대로, 나는 작업 디렉터리를 의존항으로 보고, 공급업체의 하위 모듈을 도입하는 것처럼 bundler에 도입한다.기본적으로 나는 설정하고 있다.
/project
|- project.gemspec
`- Gemfile

[project.gemspec]
Gem::Specification.new do |s|
  s.name = "project"
  s.version = "0.0.1"
end

[Gemfile]
gem "project", "= 0.0.1", :vendored_at => "."
다른 점은, 내 예시에서 프로젝트 이름과 버전을 설정하기 위해 gmpec를 불러오는 것이다.그리고 프로젝트gempec와 진정한 하위 모듈 의존 관계를 얻기 위해 디렉터리globbing을 사용하여 원본 코드를 설정합니다.
spec = eval(File.read('project.gemspec'))
gem "#{spec.name}", "#{spec.version}"

glob_source File.dirname(__FILE__), "*.gemspec", "submodule/*/*.gemspec"
그리고 물론 나도 CC를 추가했지.
이 방법의 장점은 Gemfile이 현재gemspec에 의해 완전히 정의되었다는 데 있다.사실상, 만약 이것이 어떤 방식으로 내장된다면, 기술적으로 말하자면, 너는 이 서류를 필요로 하지 않을 것이다.Gempec를 관리하면 발표와 테스트 환경을 관리할 수 있습니다. (때로는 좋고 때로는 좋지 않습니다.)
내가 발견한 유일한 단점은 최종적으로 순환 기호 링크를 만들 것이다. 그 중에서 다음과 같다.
/project
`- vendor
   `- gems
      `- gems
         `- project-0.0.1    # points to /project
테스트에는 영향을 주지 않지만 Textmate가 중단됩니다(http://ticket.macromates.com/show?ticket_id=63D71CFD). 나는 이 문제를 해결하기 위해 저장소 생성 코드에 내용을 추가함으로써 순환 기호 링크가 생기지 않는다.
어쨌든 버블러는 아주 좋은 일을 했다.고맙습니다

토론 #셋

마스터의 프로그램입니다.

좋은 웹페이지 즐겨찾기