setuptools以åã¯ãäž»ãªé åžåœ¢åŒã¯ãœãŒã¹ãã¡ã€ã«ãŸãã¯Windowsçšã®ãã€ããªMSIé åžã§ããã Linuxã§ã¯ã
bdist_dumb
ãš
bdist_rpm
ã¯æåã¯å£ããŠããŸããããããã¯Red HatããŒã¹ã®ã·ã¹ãã ã§ã®ã¿æ©èœããŸããã ãããã
bdist_rpm
ããã人ã ã䜿çšãéå§ããã«ã¯ååã«
bdist_rpm
ããŸããã§ããã
æ°å¹Žåã PJEã¯distutilsãæ¹åããPythonããã±ãŒãžã«ã¡ã¿ããŒã¿ãè¿œå ããããã«ãsetuptoolsãšpkg_resourcesã®æ··åç©ãæäŸããããšã«ããããã®åé¡ãä¿®æ£ããããšããŸããã ããã«å ããŠã圌ã¯ããããã€ã³ã¹ããŒã«ããeasy_installãŠãŒãã£ãªãã£ãæžããŸããã ã¡ã¿ããŒã¿ããµããŒãããé åžåœ¢åŒããªãããããåµã圢åŒãæäŸãããŠããŸããã
Python eggã¯ãpythonããã±ãŒãžãšå¿ èŠãªã¡ã¿ããŒã¿ãå«ãéåžžã®zipã¢ãŒã«ã€ãã§ãã å€ãã®äººãããŸã«åµãæå³çã«åéããããšã¯ãªãã§ãããããã¡ã¿ããŒã¿ã®åœ¢åŒã¯ãŸã å¥åšã§ãã ãããŠã誰ããsetuptoolsã䜿çšããŠãããžã§ã¯ããå±éããŠããŸãã
æ®å¿µãªããããã°ããããŠãã³ãã¥ããã£ã¯åè£ãããã®äžéšã¯ãã€ããªåœ¢åŒãç¹ã«ãåµãã®æ¶æ» ã宣èšããŸããã ãã®åŸãeasy_installã眮ãæããpipã¯ãegg圢åŒã®åãå ¥ããåæ¢ããŸããã
ããããããå°ãæéãçµã¡ããã€ããªããã±ãŒãžã®æåŠãäžäŸ¿ãåŒãèµ·ããå§ããŸããã 人ã ã¯ãŸããŸãã¯ã©ãŠããµãŒããŒã«å±éãå§ããåãã·ã³ã§C-shnyã©ã€ãã©ãªãåã³ã³ãã€ã«ããå¿ èŠæ§ã¯ããŸãåã°ãããããŸããã åœæã®ãåµãã¯ãããŸãã ã£ãã®ã§ïŒç§ã¯ããæãïŒããããã¯æ°ããPEPã§ããçŽãããã ãã€ãŒã« ããšåŒã°ããŸããã
ããã«ããã¹ãŠã®ã¢ã¯ã·ã§ã³ãvirtualenvç°å¢ã§è¡ããããšæ³å®ãããŠããŸã ã
ã©ããªãã€ãŒã«ïŒ
ç°¡åãªãã®ããå§ããŸãããã ããã€ãŒã«ããšã¯äœã§ããããŸããåµããšã©ãéãã®ã§ããïŒ ã©ã¡ãã®åœ¢åŒãzipãã¡ã€ã«ã§ãã äž»ãªéãã¯ãåµã¯é梱ããã«ã€ã³ããŒãã§ããã®ã«å¯Ÿãããã€ãŒã«ã¯é梱ããå¿ èŠãããããšã§ãã è»èŒªãèŒžå ¥äžå¯ã«ããæè¡çãªçç±ã¯ãããŸããããçŽæ¥èŒžå ¥ã®ãµããŒãã¯èšç»ãããŠããŸããã
ãã1ã€ã®éãã¯ããåµãã«ã¯ã³ã³ãã€ã«æžã¿ã®ãã€ãã³ãŒããå«ãŸããã®ã«å¯Ÿããããã€ãŒã«ãã«ã¯å«ãŸããªãããšã§ãã ããã®äž»ãªå©ç¹ã¯ãlibpythonãä»ããŠãªã³ã¯ãããã¢ãžã¥ãŒã«ãé åžããå¿ èŠããããŸã§ãPythonã®ããŒãžã§ã³ããšã«åå¥ã®ãã€ãŒã«ãäœæããå¿ èŠããªãããšã§ãã Python 3ã®æ°ããããŒãžã§ã³ã§ã¯ãå®å®ããABIã䜿çšããŠããŸãããããããã§ã«åŒ·åãããŠããŸãã
ãã ãããã€ãŒã«åœ¢åŒã«ãåé¡ããªãããã§ã¯ãªãããã®äžéšã¯ãåµãããç¶æ¿ããŠããŸãã ããšãã°ãLinuxã§ã®ãã€ããªãã£ã¹ããªãã¥ãŒã·ã§ã³ã¯ãPythonèªäœãããŸããŸãªåœ¢åŒã§Linuxã§ã³ã³ãã€ã«ãããããšãšãã¢ãžã¥ãŒã«ãããŸããŸãªã·ã¹ãã ã©ã€ãã©ãªã«ãªã³ã¯ãããšãã2ã€ã®æ¬ ç¹ããããããã»ãšãã©ã®å ŽåãŸã åãå ¥ããããŸããã æåã®åé¡ã¯ãPython 2ïŒUSC2ãšUSC4ã®äºææ§ã®ãªãããŒãžã§ã³ã®å ±åãåå ã§ãã ABIã¯ãã³ã³ãã€ã«ã¢ãŒãã«å¿ããŠå€ãããŸãã çŸåšããã€ãŒã«ïŒç§ãç¥ãéãïŒã«ã¯ãã©ã€ãã©ãªãé¢é£ä»ããããŠããUnicodeã¢ãŒãã«é¢ããæ å ±ãå«ãŸããŠããŸããã å¥ã®åé¡ã¯ãLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã®äºææ§ãç§ãã¡ãæãã§ãããããäœãããšã§ãããç¶æ³ã«ãã£ãŠã¯ããããã£ã¹ããªãã¥ãŒã·ã§ã³çšã«ã³ã³ãã€ã«ãããã¢ã»ã³ããªãä»ã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§åäœããªãããšããããŸãã
ããã¯ãã¹ãŠãäžè¬çã«èšãã°ãçŸæç¹ã§ã¯ããã€ããªããã€ãŒã«ããããŸããŸãªã·ã¹ãã ãšã®äºææ§ããªããšããŠPyPIã«ã¢ããããŒãã§ããªããšããäºå®ã«å€æãããŸãã
ããããã¹ãŠã«å ããŠããã€ãŒã«ã¯ããã€ããªããã±ãŒãžãšçŽç²ãªpythonã³ãŒããå«ãããã±ãŒãžãšãã2ã€ã®æ¥µç«¯ãªç¹ã®ã¿ãèªèããŸãã ãã€ããªããã±ãŒãžã¯ãPythonãã©ã³ã2.xã«åºæã§ãã ããã¯ã2.xãµã€ã¯ã«ãçµããã«è¿ã¥ããŠããããã倧ããªåé¡ã§ã¯ãªãããã«æãããŸãããŸãã2.7ã§ã®ã¿åéãããããã±ãŒãžã¯ãé·ãéååã§ãã ããããPython 2.8ãçªç¶ç»å Žããå Žåããã®ããã±ãŒãžã¯Pythonã®ããŒãžã§ã³ã«äŸåããªããããã€ããªãå«ãŸããŠãããããã¢ãŒããã¯ãã£ã«äŸåããããåŸãªããšããã®ã¯èå³æ·±ãããšã§ãã
ãã®ãããªããã±ãŒãžã®ååšãæ£åœåããå¯äžã®ã±ãŒã¹ã¯ãCFFIããctypesã§ããŒããããåæ£ã©ã€ãã©ãªãå«ãŸããŠããå Žåã§ãã ãã®ãããªã©ã€ãã©ãªã¯libpythonãä»ããŠãªã³ã¯ãããŠããããèšèªå®è£ ããç¬ç«ããŠããŸãïŒpypyã§ã䜿çšã§ããŸãïŒã
ããããæããé¢ããããŸããç¬èªã®åçš®ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã§ã®ãã€ããªãã€ãŒã«ã®äœ¿çšãçŠæ¢ãããã®ã¯ãããŸããã
ãã€ãŒã«ã¢ã»ã³ããª
ããã§ããã€ãŒã«ãšã¯äœããããããŸããã ç¬èªã®ããã€ãŒã«ãã®äœãæ¹ ç¬èªã®ã©ã€ãã©ãªããçµã¿ç«ãŠãã®ãæãç°¡åãªããã»ã¹ã§ãã å¿ èŠãªã®ã¯ãææ°ããŒãžã§ã³ã®
setuptools
ãš
wheel
ã©ã€ãã©ãªã ãã§ãã äž¡æ¹ãã€ã³ã¹ããŒã«ããããšã次ã®ã³ãã³ãã§ããã€ãŒã«ããçµã¿ç«ãŠãããŸãã
$ python setup.py bdist_wheel
ãã€ãŒã«ã¯ããã±ãŒãžãã£ã¬ã¯ããªã«äœæãããŸãã ãã ãã泚æãå¿ èŠãªããšã1ã€ãããŸãããã€ããªã®é åžã§ãã ããã©ã«ãã§ã¯ãã¢ã»ã³ãã«ãããããã€ãŒã«ãïŒsetup.pyã§ãã€ããªã¹ãããã䜿çšãããŠããªãããšãåæãšããŠããŸãïŒã¯ãçŽç²ãªPythonã³ãŒãã§æ§æãããŠããŸãã ããã¯ãããã±ãŒãžã®äžéšãšããŠ
.so
ã
.dylib
ãŸãã¯
.dll
ãé åžããå Žåã§ããçµæã®ããã€ãŒã«ãã¯ãã©ãããã©ãŒã ã«äŸåããªãããã«èŠããããšãæå³ããŸãã
ãã®åé¡ã解決ããã«ã¯ãsetuptoolsããDistributionãæåã§å®è£ ããçŽåºŠãã©ã°ã
false
ã¹ããŒã
false
ã
import os from setuptools import setup from setuptools.dist import Distribution class BinaryDistribution(Distribution): def is_pure(self): return False setup( ..., include_package_data=True, distclass=BinaryDistribution, )
ãã€ãŒã«èšå®
ææ°ããŒãžã§ã³ã®pipã䜿çšããŠãããã€ãŒã«ãã¯æ¬¡ã®ããã«èšå®ãããŸãã
$ pip install package-1.0-cp27-none-macosx_10_7_intel.whl
ããããäŸåé¢ä¿ã¯ã©ãã§ããïŒ ããã€ãã®å°é£ããããŸãã éåžžãããã±ãŒãžã®èŠä»¶ã®1ã€ã¯ãã€ã³ã¿ãŒãããã«æ¥ç¶ããŠããªããŠãã€ã³ã¹ããŒã«ã§ããããšã§ãã 幞ããªããšã«ãpipã䜿çšãããšãã€ã³ããã¯ã¹ããã®èªã¿èŸŒã¿ãç¡å¹ã«ããã€ã³ã¹ããŒã«ããå¿ èŠããããã¹ãŠã®ãã®ãå«ããã£ã¬ã¯ããªãã€ã³ã¹ããŒã«ã§ããŸãã å¿ èŠãªããŒãžã§ã³ã®ãã¹ãŠã®äŸåé¢ä¿ã®ãã€ãŒã«ãããå Žåã¯ã次ãå®è¡ã§ããŸãã
$ pip install --no-index --find-links=path/to/wheels package==1.0
ãã
1.0
ããã±ãŒãž
package
ããŒãžã§ã³
1.0
ä»®æ³ç°å¢ã«ã€ã³ã¹ããŒã«ãããŸãã
äžæ¯çšãã€ãŒã«
ããŠããããããã¹ãŠã®äŸåé¢ä¿ã«.whlããªãå Žåã¯ã©ãã§ããããïŒ çè«äžã®ãããã«ããã
wheel
ã³ãã³ãã䜿çšããŠãã®åé¡ã解決ã§ããŸãã ããã¯æ¬¡ã®ããã«åäœããŸãïŒ
pip wheel --wheel-dir=path/to/wheels package==1.0
ãã®ã³ãã³ãã¯ãæå®ãããã©ã«ããŒã«äŸåããããã±ãŒãžã®ãã¹ãŠã®ããã±ãŒãžãã¢ã³ããŒãããŸãã ããããããã€ãã®åé¡ããããŸãã
1ã€ã¯ãããŒã ã«ã¯çŸåšãæ¢ã«ããã€ãŒã«ãã§ããäŸåé¢ä¿ãã¢ã³ããŒãããªããã°ããããšããããšã§ãã ãã®ãããPyPIã§ãã€ãŒã«åœ¢åŒã®äŸåé¢ä¿ãæ¢ã«å©çšå¯èœãªå ŽåãããŒããããŸããã
ããã¯ãããŠã³ããŒããããã€ãŒã«ããã£ãã·ã¥ããæåã§ç§»åããã·ã§ã«ã¹ã¯ãªããã«ãã£ãŠäžæçã«è§£æ±ºãããŸãã
#!/bin/sh WHEEL_DIR=path/to/wheels DOWNLOAD_CACHE_DIR=path/to/cache rm -rf $DOWNLOAD_CACHE_DIR mkdir -p $DOWNLOAD_CACHE_DIR pip wheel --use-wheel -w "$WHEEL_DIR" -f "$WHEEL_DIR" \ --download-cache "$DOWNLOAD_CACHE_DIR" package==1.0 for x in "$DOWNLOAD_CACHE_DIR/"*.whl; do mv "$x" "$WHEEL_DIR/${x##*%2F}" done
2çªç®ã®åé¡ã¯ããå°ãæ·±å»ã§ãïŒPyPIã«ãªãå Žåãpipã¯ã©ã®ããã«ããŠç¬èªã®ããã±ãŒãžãèŠã€ããã®ã§ããïŒ ããã§ããäœããããŸããã ãã®å Žåãããã¥ã¡ã³ãã§ã¯ã
pip wheel package
ã§ã¯ãªãã
pip wheel -r requirements.txt
ã䜿çšããããšãæšå¥šããŠã
pip wheel -r requirements.txt
ãããã§ã
requirements.txt
ã«ã¯å¿ èŠãªäŸåé¢ä¿ããã¹ãŠå«ãŸããŠããŸãã
DevPIã䜿çšããããã±ãŒãžã®æ§ç¯
äŸåé¢ä¿ã®åé¡ã«å¯Ÿãããã®ãããªäžæçãªè§£æ±ºçã¯ãåçŽãªç¶æ³ã§ã¯éåžžã«åœãŠã¯ãŸããŸãããçžäºã«äŸåããå éšPythonããã±ãŒãžãå€æ°ããå Žåã¯ã©ãã§ããããã ãã®èšèšã¯ããã«åŽ©å£ããŸãã
幞ããªããšã«ãæšå¹ŽãHolker Krekelã¯DevPIãšåŒã°ãããã®çœå®³ã«å¯Ÿãããœãªã¥ãŒã·ã§ã³ãäœæããŸãããããã¯åºæ¬çã«ãPyPIã§pipã®åäœããšãã¥ã¬ãŒãããããã¯ã§ãã DevPIã¯ã³ã³ãã¥ãŒã¿ãŒã«ã€ã³ã¹ããŒã«ããããšãPyPIã®åã«ééãããã·ãšããŠæ©èœããpipãããŒã«ã«ãªããžããªããããã±ãŒãžãã€ã³ã¹ããŒã«ã§ããããã«ããŸãã ããã«ãPyPIããããŠã³ããŒãããããã¹ãŠã®ããã±ãŒãžã¯èªåçã«ãã£ãã·ã¥ãããããããããã¯ãŒã¯ãåæããŠãããããã®ããã±ãŒãžã¯ã€ã³ã¹ããŒã«ã§ããŸãã ãããŠãæçµçã«ããããªãã¯ã€ã³ããã¯ã¹ã«ä¿åãããŠããããã±ãŒãžãšåãæ¹æ³ã§ããããåç §ããããã«ãããŒã«ã«ãµãŒããŒã«ç¬èªã®ããã±ãŒãžãã¢ããããŒãããããšãå¯èœã«ãªããŸãã
ããŒã«ã«ã®virtualenvã«DevPIãã€ã³ã¹ããŒã«ããããšããå§ãã
devpi-server
ã
devpi
ã
PATH
ã«
devpi-server
ãš
devpi
ãžã®ãªã³ã¯ãè¿œå ããŸãã
$ virtualenv devpi-venv $ devpi-venv/bin/pip install --upgrade pip wheel setuptools devpi $ ln -s `pwd`/devpi-venv/bin/devpi ~/.local/bin $ ln -s `pwd`/devpi-venv/bin/devpi-server ~/.local/bin
ãã®åŸã
devpi-server
ãèµ·åããããã«æ®ããæåã§åæ¢ãããŸã§æ©èœããŸãã
$ devpi-server --start
èµ·ååŸãäžåºŠåæåããå¿ èŠããããŸãã
$ devpi use http://localhost:3141 $ devpi user -c $USER password= $ devpi login $USER --password= $ devpi index -c yourproject
ç§ã¯ãèªåçšãã«DevPIã䜿çšããŠãããããDevPIã®ãŠãŒã¶ãŒåãšã·ã¹ãã ã®ãŠãŒã¶ãŒåã¯åãã§ãã æåŸã®ã¹ãããã§ããããžã§ã¯ãã®ååã§ã€ã³ããã¯ã¹ãäœæãããŸãïŒå¿ èŠã«å¿ããŠãè€æ°äœæã§ããŸãïŒã
pipãããŒã«ã«ãªããžããªã«ãªãã€ã¬ã¯ãããã«ã¯ãç°å¢å€æ°ããšã¯ã¹ããŒãã§ããŸãã
$ export PIP_INDEX_URL=http://localhost:3141/$USER/yourproject/+simple/
ãã®ã³ãã³ãã
postactivate
ã¹ã¯ãªããã«å ¥ããŠã誀ã£ãã€ã³ããã¯ã¹ããã®å¶çºçãªããŒããé²ããŸãã
ããŒã«ã«ã®DevPIã«ç¬èªã®ãã€ãŒã«ãé 眮ããã«ã¯ã
devpi
ãŠãŒãã£ãªãã£ã
devpi
ãŸãã
$ devpi use yourproject $ devpi upload --no-vcs --formats=bdist_wheel
--no-vcs
ã¯ãããŒãžã§ã³ç®¡çã·ã¹ãã ãèå¥ããããšããããžãã¯ãç¡å¹ã«ããæåã«ããã€ãã®ãã¡ã€ã«ã移åããŸãã ç§ã®ãããžã§ã¯ãã§ã¯ãVCSã«å«ãŸããŠããªããã¡ã€ã«ïŒãã€ããªãªã©ïŒãé åžãããŠãããããããã¯å¿ èŠãããŸããã
æçµçã«ãPyPIãæåŠããDevPIã
setup.py resease
誀ã£ãŠã³ãŒãããªãŒããŒããŒãããªãããã«ãsetup.pyãã¡ã€ã«ãåå²ããããšã匷ããå§ãããŸãã ãããè¡ãæãç°¡åãªæ¹æ³ã¯ã誀ã£ãPyPIåé¡åãè¿œå ããããšã§ãã
setup( ... classifier=['Private :: Do Not Upload'], )
ãŸãšã
ããã§ããã¹ãŠãå éšäŸåé¢ä¿ã䜿çšããç¬èªã®ããã€ãŒã«ããçµã¿ç«ãŠå§ããæºåãã§ããŸããã 衚瀺ããããããã«ãã¢ãŒã«ã€ãããå¥ã®ãµãŒããŒã«ããŠã³ããŒãããŠãå¥ã®virtualenvã«ã€ã³ã¹ããŒã«ã§ããŸãã
pip wheel
ãæ¢åã®wheelããã±ãŒãžãç¡èŠããªããªããšãããã»ã¹å šäœãå°ãç°¡åã«ãªããŸãã ãããŸã§ã®éãäžèšã®ã·ã§ã«ã¹ã¯ãªããã¯ææªã®è§£æ±ºçã§ã¯ãããŸããã
ãåµããšæ¯èŒããŠ
ãã€ãŒã«åœ¢åŒã¯ãeggãããé åçã§ãã éçºããã掻çºã«ãªããPyPIããµããŒããè¿œå ãå§ãããŠãŒãã£ãªãã£ãããã䜿ãå§ããã®ã§ããããæè¯ã®ãœãªã¥ãŒã·ã§ã³ã®ããã«èŠããŸãã ãåµãã¯ãããŸã§ã®ãšããeasy_installã§ã®ã¿ãµããŒããããŠããŸãããã»ãšãã©ã¯é·ãépipã«åãæ¿ããŸããã
Zopeã³ãã¥ããã£ã¯ãŸã æ倧ã®åµããŒã¹ããã³ãã«ãã¢ãŠãããŒã¹ã®ã³ãã¥ããã£ã ãšæããŸãã ãããŠããåµãã«åºã¥ãããœãªã¥ãŒã·ã§ã³ãããªãã®å Žåã«é©çšã§ãããªãããããé©çšãã¹ãã ãšæããŸãã å€ãã®äººã¯åµããŸã£ãã䜿çšãããvirtualenvãäœæããã¢ãŒã«ã€ãããŠå¥ã®ãµãŒããŒã«éä¿¡ããããšã奜ã¿ãŸãã ç°ãªããµãŒããŒã«ã¯ç°ãªãã©ã€ãã©ãªãã¹ãããå¯èœæ§ãããããããã®ãããªå±éã®å Žåãwheelsãæé©ãªãœãªã¥ãŒã·ã§ã³ã§ãã virtualenvã®ãã«ããµãŒããŒã§
.pyc
ãã¡ã€ã«ãäœæããããããã®ãã¡ã€ã«ã«ç¹å®ã®ãã¡ã€ã«ãã¹ãå«ãŸãããšããåé¡ããããŸããã wheel
.pyc
ã䜿çšãããšãä»®æ³ç°å¢ãžã®ã€ã³ã¹ããŒã«åŸã«äœæãããèªåçã«æ£ãããã¹ãèšå®ãããŸãã
ã ããä»ãããªãã¯ãããæã£ãŠããŸãã è»èŒªã®äžã®Pythonã ãããŠãããã¯äžçš®ã®æ©èœã§ãããããããæéãè²»ãã䟡å€ããããŸãã