2012-09-25 2 views
1

내가 작업중인 프로젝트는 많은 빌드 단계에서 패브릭을 사용하며 대체 빌드로 오프라인 빌드가 필요합니다.오프라인 패키지 설치용 패브릭

현재 tarball에 제공된 python 패키지를 설치하는 데 어려움이 있습니다.

문제는 새로 추출 된 디렉토리에 들어가서 setup.py install을 실행하는 데 문제가 있습니다.

@task 
def deploy_artifacts(): 
    """Installs dependencies from local path, useful for offline builds""" 
    #TODO: Handle downloading files and do something like this bellow 
    tmpdir = tempfile.mkdtemp() 
    artifacts_path = '' 
    if not 'http' in env.artifacts_path: 
     artifacts_path = env.artifacts_path 

    with lcd(artifacts_path): 

     for f in os.listdir(artifacts_path): 
      if 'gz' in f: 
       put(f, tmpdir) 
       tar = os.path.join(tmpdir, f) 
       target_dir = os.path.join(tempfile.gettempdir(), normalize(f)) 
       if not files.exists(target_dir): 
        run('mkdir %s' % target_dir) 
       else: 
        run('rm -rf %s' %target_dir) 
        run('mkdir %s' % target_dir) 
       run('tar xf %s -C %s' % (tar, target_dir)) 
       run('rm %s' % tar) 
       with cd(target_dir): 
        sudo('python setup.py install') 

은 내가 bazillion 시간의 tar man 페이지를 읽고 와서 내가 원하는 것을 얻기에 갑자기 근처에 있어요.

여러분 중 일부가 이와 같은 상황에 직면 했습니까? 이 시나리오에 대한 다른 (읽기 : 더 나은) 접근법이 있습니까?

+0

어떤 특별한 오류 메시지가 있습니까? 이 방법을 목표로하는 것을 제안하기가 어렵습니다. – favoretti

+0

_maybe_의 경우,'tar'를'/ bin/tar'로 바꾸어보십시오. 또한'run'의 오류 출력을 인쇄하여 어떤 단계가 실패하는지 확인하십시오. – favoretti

+0

나는 내 단계에서 오류가 없다. 단지 확장 된 디렉토리를'tar '출력으로 얻을 수 없다는 것이다. – tutuca

답변

1

귀하가하려는 일에 아무런 문제가 없습니다 (원칙적으로). 어쩌면 거기에 점점 더 작은 단계를 취하십시오. 임시 디렉토리를 사용하는 대신 모든 것이 규약에 의해 쓰여지는 알려진 권한을 가진 체계적인 위치에 놓이면 디버깅이 쉬워 질 수 있습니다. 적어도 그렇게되면 패브릭과 수동 개입의 일부 조합을 사용하여 어떤 일이 잘못되고 있는지 확인할 수 있습니다.

장기적으로 볼 때 몇 가지 대안이 있습니다. 단순하게하기 위해 온라인과 오프라인 버전이 같은 방식으로 작동하기를 원합니다. 두 경우 모두 easy_install/pip을 사용하여 패키지를 가져 오는 것을 의미합니다.

이 작업을 수행하는 한 가지 방법은 PyPi 미러를 작성하는 것입니다. 충분한 저장 공간 (30Gb)을 가지고 있다면 이것을 수행하는 올바른 방법은 PEP381 (PyPI 용 미러링 인프라)을 구현하는 소프트웨어를 사용하는 것입니다. 이미이를 수행하는 클라이언트가 있습니다 (pep381client). 비슷한 일을하는 다른 프로젝트도 많이 있습니다 (basketweaver, djangopypi2, chishop).

대체 방법은 더 가벼운 프록시 구성을 고려하는 것입니다. 나는 pip2pipipli을 찾고 있었다. easy_install을 사용하여 직접 작동하는지 확신 할 수 없지만 시도해 볼 가치가 있습니다.

핍을 사용했다면 타르볼에서 직접 설치했을 수도 있습니다.

+0

좋은 답변입니다. 이 문제에 대한 몇 가지 테스트를 수행하고 결과를 게시하기 위해 다시 방문하겠습니다. – tutuca

+0

https://pypi.python.org/pypi/bandersnatch에서 찾을 수있는'pep381client' 대신'bandersnatch'를 사용할 것을 권장합니다. – glormph