2016-08-12 17 views
3

我想重新組織我的python軟件包版本控制,因此我只需要在一個地方更新版本,最好是一個python模塊或文本文件。對於所有我需要我的版本的地方,似乎有一種方法可以從源文件from mypkg import __version__加載它,或者至少將它從文件中解析出來作爲文本。雖然我似乎無法找到一種方法來處理我的conda meta.yaml文件。有沒有辦法從meta.yaml文件中的外部源加載版本?從源文件獲取conda meta.yaml的打包版本

我知道有git環境變量,但我不想標記每個通過本地conda存儲庫進行測試的alpha/beta/rc提交。我可以在pyyaml中使用!!python/object加載python對象,但conda不支持任意python執行。我沒有辦法與其他jinja2功能做到這一點。我也可以編寫一個腳本來在多個地方更新版本號,但我真的只希望將一個文件修改爲最終版本號。謝謝你的幫助。

+0

FYI任何人來到這個它得到一個更好的答案之前,我已經在Git標籤入駐*和*我增加了一個特殊的命令,我setup.py在一些包裝工具,我撞的版本使用(Inno Setup for Windows),我的'version.py',並執行需要的git提交和標籤。 – daveydave400

回答

1

有很多方法可以到達端點。以下是conda本身的作用...

conda的版本信息的真實來源是__version__conda/__init__.py。按照您的建議,它可以在Python代碼中以編程方式加載爲from conda import __version__。它也被硬連接到setup.pyhere(注意this code),所以從命令行python setup.py --version是獲取該信息的規範方式。

在暢達建造的1.x版,放線

$PYTHON setup.py --version > __conda_version__.txt 

build.sh將設置版本使用我們的真理的來源內置包。 然而,__conda_version__.txt文件已棄用,它可能會隨着conda-build 2.0的發佈而被刪除。在conda-build的最新版本中,首選的方法是在jinja2上下文中使用load_setup_py_data(),這將允許您訪問來自setup.py的所有元數據。具體而言,在meta.yaml文件,我們就會有這樣的事情

package: 
    name: conda 
    version: "{{ load_setup_py_data().version }}" 

現在,__version__變量是如何在conda/__init__.py設置...

see in the source code是什麼給auxlib.packaging.get_version()通話功能。這個函數爲了

  1. 首先查找一個文件conda/.version下,如果發現返回的內容版本標識符
  2. 尋找未來的VERSION環境變量,如果設置返回值作爲版本標識符
  3. 看最後在git describe --tags輸出,並且如果可能的話返回的版本標識符(必須安裝GIT中,必須是git倉庫,等等等等)
  4. 如果沒有以上產率的版本標識符,則返回None

現在只有一個最後的把戲。在conda的setup.py file中,我們將cmdclass設置爲build_pysdistauxlib.packaging提供的那些。基本上我們有

from auxlib import packaging 
setup(
    cmdclass={ 
     'build_py': packaging.BuildPyCommand, 
     'sdist': packaging.SDistCommand, 
    } 
) 

這些特殊命令類實際修改conda/__init__.py文件中內置/安裝的軟件包,因此__version__變量是硬編碼爲一個字符串,並且不使用auxlib.packaging.get_version()功能。


在你的情況下,不希望每次標記發佈,你可以使用所有上述情況,並在命令行中使用VERSION環境變量設置的版本。喜歡的東西

VERSION=1.0.0alpha1 conda build conda.recipe 

在你build部分meta.yaml食譜,你需要添加一個script_env鍵告訴暢達建造一路走過來傳遞VERSION環境變量設置爲構建環境。

build: 
    script_env: 
    - VERSION 
+0

我會補充說,有這樣的例子在https://github.com/conda/conda-build/tree/master/tests/test-recipes/metadata/source_setup_py_data,這與任何設置版本的方式setup.py - versioneer,setuptools-scm或其他。另請注意,load_setup_py_data過去被命名爲load_setuptools。這在1.21.12改變了。這兩個名稱現在都有效,但load_setuptools將輸出一條關於被棄用的警告消息。 – msarahan

+0

太棒了。對於'load_setup_py_data'來看,PR看起來好像還沒有(至少現在是這樣命名的)很長時間了。感謝您的幫助,我今天會嘗試一下。 ...但是當我引起你的注意的時候,如果anaconda軟件包的bug報告(seg故障等)進入'conda/conda'或'ContinuumIO/anaconda-recipes'嗎? – daveydave400

+0

軟件包的錯誤報告通常應該發送到ContinuumIO/anaconda問題。如果您對配方有特定的改進,請在ContinuumIO/anaconda-recipes上提交PR或問題。 conda/conda專門針對包裹管理工具conda的問題。 – msarahan