2012-09-25 75 views
1

我正在使用的項目將織物用於許多構建步驟,並且需要脫機構建作爲後備。面料用於脫機包安裝

我目前被困在安裝在tarballs中提供的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') 

我來自閱讀tar手冊頁bazillion時間,我無處附近得到我想要的東西。

你們有沒有遇到這樣的情況?有沒有其他一些(閱讀:更好)的方法來應對這種情況?

+0

任何特定的錯誤消息?很難建議任何目標這種方式。 – favoretti

+0

_maybe_的一件事是,請嘗試用'/ bin/tar'替換tar。也可以嘗試打印'run'的錯誤輸出來查看哪一步失敗。 – favoretti

+0

我的步驟中沒有錯誤,只是我無法將展開的目錄作爲'tar'輸出。 – tutuca

回答

1

沒有什麼錯(原則上)與你正在嘗試做什麼。也許只是採取更小的步驟到達那裏。如果將所有內容放在系統位置中,而不使用臨時目錄,則可能會使調試變得更加容易。至少可以讓你使用面料和人工干預的組合來檢查發生了什麼問題。

從長遠來看,我看到了一些替代方案。爲了簡單起見,您希望在線和離線版本以相同方式工作,這意味着在兩種情況下都使用easy_install/pip獲取軟件包。

這樣做的一種方法是構建一個PyPi的鏡像。如果您擁有足夠的存儲空間(30Gb),則正確的方法是使用實​​現PEP381(PyPI的鏡像基礎結構)的軟件,但已有客戶端執行此操作(pep381client)。許多其他項目可以做類似的事情(basketweaver,djangopypi2chishop)。

另一種方法是考慮更輕的代理方案。我一直在尋找pip2pipipli。我不確定他們是否會直接使用easy_install,但是值得一試。

還值得注意的是,如果您使用pip,則可以直接從tarball安裝。

+0

很棒的回答。我會對此做一些測試,然後回來發佈結果。 – tutuca

+0

我建議使用'bandersnatch'而不是'pep381client',可以在https://pypi.python.org/pypi/bandersnatch找到 – glormph