devpi ๋ฅผ pypi ํจํค์ง๋ฅผ ํ๋ก์ ์บ์ํ๊ณ ์์ฒด ๋ด๋ถ ํจํค์ง๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ฐ์ธ pypi ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ด pip.conf
๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[global]
index_url = https://pypi.priv.xxx/prod/+simple/
[search]
index = https://pypi.priv.xxx/prod/
์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธํ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์ด๋ฌํ ํญ๋ชฉ์ Pipfile๋ก ์ด๋ํด์ผ ํฉ๋๋ค.
@kennethreitz ๋ด ๊ฒฝ์ฐ๊ฐ ๋ช
ํํ์ง ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก pipenv๋ฅผ ์์ํ๋ ๋์ ๊ฒช์๋ ๋ช ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํตํด ์ค๋ํด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ pipenv, ์๋ ๋ฐฉ์ ๋ฐ ์ฝ๋์ ๋ํด ์์๋ณด๊ธฐ ์์ํ์ต๋๋ค. Pipfile
์์ ์์ค๋ฅผ ์ง์ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์๊ณ ~/.pypirc
์์ ์ํํ ์ ์๋ ๊ฒ๊ณผ ์ ์ฌํ ๋ช
๋ช
๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
$ mkdir foobar
$ cd foobar
$ pipenv install --verbose requests
โ New python executable in /home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf/bin/python
Installing setuptools, pip, wheel...done.
Virtualenv location: /home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf
Installing requestsโฆ
โ Installing u'requests'
$ "/home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install --verbose "requests"
-i https://pypi.python.org/simple --exists-action w
Collecting requests
1 location(s) to search for versions of requests:
* https://pypi.python.org/simple/requests/
Getting page https://pypi.python.org/simple/requests/
[...]
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22
Cleaning up...
Adding requests to Pipfile's [packages]โฆ
PS: You have excellent taste! โจ ๐ฐ โจ
Locking [dev-packages] dependenciesโฆ
Locking [packages] dependenciesโฆ
Updated Pipfile.lock (76e6d4)!
pypi๊ฐ ๋ชจ๋ฅด๋ ํจํค์ง๋ฅผ ์ค์นํ๋ฉด ๋ฐ๋ก ์๋ํ์ง ์์ต๋๋ค(pip ๋๋ pip-tools๋ pip.conf
์ค์ ์ ์ฌ์ฉํ๋ฏ๋ก ์๋ํจ).
$ pipenv install --verbose palantir
Installing palantirโฆ
โ Installing u'palantir'
$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install --verbose "palantir" -i https://pypi.python.org/simple --exists-action w
Collecting palantir
1 location(s) to search for versions of palantir:
[...]
Error: An error occurred while installing palantir!
Could not find a version that satisfies the requirement palantir (from versions: )
No matching distribution found for palantir
Pipfile
๊ฐ ์ ์ธ๋ฑ์ค๋ก ์ค์ ๋๊ณ ํจํค์ง๊ฐ ์ด ์ธ๋ฑ์ค์ ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒฝ์ฐ(https://docs.pipenv.org/advanced.html#specifying-package-indexes์ ๋ฐ๋ผ) ๋ค์์์ ํจํค์ง๋ฅผ ์ค์นํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ด์จ๋ ๋ช
๋ น์ค์ pypi
๋จผ์ ํธ์ถํฉ๋๋ค.
$ pipenv install --verbose palantir
Installing palantirโฆ
โ Installing u'palantir'
$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install --verbose "palantir"
-i https://pypi.python.org/simple --exists-action w
โ $ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install --verbose "palantir"
-i https://pypi.priv.xxx/prod/+simple/ --exists-action w
Collecting palantir
1 location(s) to search for versions of palantir:
[...]
Successfully installed palantir-1.1.5
Cleaning up...
Adding palantir to Pipfile's [packages]โฆ
Locking [dev-packages] dependenciesโฆ
Locking [packages] dependenciesโฆ
pip-tools
์ํด ์์ฑ๋ ์๊ตฌ ์ฌํญ ํ์ผ ์ฌ์ฉpip-tools
๋ฅผ ์ฌ์ฉํ ๋ ์๊ตฌ ์ฌํญ ํ์ผ์ ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ธ๋ฑ์ค๋ก ์์ํฉ๋๋ค.
#
# This file is autogenerated by pip-compile
# To update, run:
#
# pip-compile --output-file requirements.txt requirements.in
#
--index-url https://pypi.priv.xxx/prod/+simple/
bcrypt==3.0.0
[...]
์ด ์ค์ ์ ์๊ตฌ ์ฌํญ ํ์ผ์ ์ฌ์ฉํ ๋ ์ ์ฉ๋์ง ์์ต๋๋ค(๊นจ๋ํ ํ๋ก์ ํธ๋ก ์์):
$ pipenv install -r requirements.txt
Requirements file provided! Importing into Pipfileโฆ
Pipfile.lock (c23e27) out of date, updating to (3c7b08)โฆ
Locking [dev-packages] dependenciesโฆ
Locking [packages] dependenciesโฆ
CRITICAL:pip.index:Could not find a version that satisfies the requirement palantir==1.1.5 (from versions: )
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
์ธ๋ฑ์ค์ UX๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ผ์ข ์ "๊ฐญ"์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Pipfile
์ธ๋ฑ์ค ํญ๋ชฉ์ ๋ง๋ค๊ณ ๋ชจ๋ ํจํค์ง๋ฅผ ์ธ๋ฑ์ค์ ์ฐ๊ฒฐํ๋๋ก ๊ฐ์ ํ๋ ๋ช
๋ น์ค์ ํตํด ์ค์นํ๋ ๋์ ์ธ๋ฑ์ค(์ด๋ฆ ๋๋ ๋ฆฌ์์ค๋ก)๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. pypi์ ํจํค์ง์ ๊ฐ์ธ ์ธ๋ฑ์ค์ ํจํค์ง๊ฐ ํ๋๋ง ์๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฆฌ ํธ๋ฆฌํ์ง ์์ต๋๋ค.์์ ๋ ธ์ถ๋ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด PR์ ์ ๊ณตํ๊ธฐ ์ํด ์ฝ๋์ ๋ฐ์ด๋ค๊ณ ์์ต๋๋ค.
pip.conf
์์ ์ฌ์ฉ์ ์ ์ ์์ธ์ ํ์ธํ์ญ์์ค.Pipfile
์ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ฅผ ์ ์ํฉ๋๋ค.Pipfile
์ถ๊ฐํฉ๋๋ค.์ธ๋ฑ์ค๊ฐ ์๊ตฌ ์ฌํญ ํ์ผ์ด๋ ๋ช
๋ น์ค์์ ์ฌ์ฉ๋์ง๋ง Pipfile
์๋ ค์ง์ง ์์ ๊ฒฝ์ฐ pipenv์์ ์ฌ์ฉ๋ venv ์ด๋ฆ ์ง์ ๊ณผ ์ ์ฌํ ์๋ ์ด๋ฆ์ผ๋ก ํญ๋ชฉ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๋ด๊ฐ ์ ๊ทธ๋ ๊ฒ ์ ๊ฒฝ์ ์จ? ์ค๊ตญ์ ์ด๊ณ ์๋ pypi๋ ํญ์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฑฐ๋ ๋น ๋ฅด์ง ์์ต๋๋ค(๋ง์ ์๊ฐ ์ด๊ณผ ๋๋ ๋๋ฆฐ ์๋ ์ ํ). ๋ฐ๋ผ์ devpi์ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ธ ํจํค์ง๋ฅผ ์บ์ํ๊ณ ํผํฉํ ์ ์๋ค๋ ๊ฒ์ ๋ ๋ฐฐ์ ์น๋ฆฌ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์ ๊ฐ๋ฐ, ํ ์คํธ, ๋์ปค ๋น๋ ๋ฑ์ ํจ์ฌ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ญ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์์ ์๊ฐ ์ด๊ณผ๊ฐ ๊ด๋ จ๋ ๋ ๋ฐ์ํ๋ ๋งค์ฐ ๊ณ ์ ์ ์ธ ๋์์ ๋๋ค.
Locking [dev-packages] dependenciesโฆ
Locking [packages] dependenciesโฆ
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
Could not find a version that matches requests==2.17.3,==2.18.4
Tried: 0.2.0, 0.2.0, 0.2.1, 0.2.1, 0.2.2, 0.2.2, 0.2.3, 0.2.3, 0.2.4, 0.2.4, 0.3.0, 0.3.0, 0.3.1, 0.3.1, 0.3.2, 0.3.2, 0.3.3, 0.3.3, 0.3.4, 0.3.4, 0.4.0, 0.4.0, 0.4.1, 0.4.1, 0.5.0, 0.5.0, 0.5.1, 0.5.1, 0.6.0, 0.6.0, 0.6.1, 0.6.1, 0.6.2, 0.6.2, 0.6.3, 0.6.3, 0.6.4, 0.6.4, 0.6.5, 0.6.5, 0.6.6, 0.6.6, 0.7.0, 0.7.0, 0.7.1, 0.7.1, 0.7.2, 0.7.2, 0.7.3, 0.7.3, 0.7.4, 0.7.4, 0.7.5, 0.7.5, 0.7.6, 0.7.6, 0.8.0, 0.8.0, 0.8.1, 0.8.1, 0.8.2, 0.8.2, 0.8.3, 0.8.3, 0.8.4, 0.8.4, 0.8.5, 0.8.5, 0.8.6, 0.8.6, 0.8.7, 0.8.7, 0.8.8, 0.8.8, 0.8.9, 0.8.9, 0.9.0, 0.9.0, 0.9.1, 0.9.1, 0.9.2, 0.9.2, 0.9.3, 0.9.3, 0.10.0, 0.10.0, 0.10.1, 0.10.1, 0.10.2, 0.10.2, 0.10.3, 0.10.3, 0.10.4, 0.10.4, 0.10.6, 0.10.6, 0.10.7, 0.10.7, 0.10.8, 0.10.8, 0.11.1, 0.11.1, 0.11.2, 0.11.2, 0.12.0, 0.12.0, 0.12.1, 0.12.1, 0.13.0, 0.13.0, 0.13.1, 0.13.1, 0.13.2, 0.13.2, 0.13.3, 0.13.3, 0.13.4, 0.13.4, 0.13.5, 0.13.5, 0.13.6, 0.13.6, 0.13.7, 0.13.7, 0.13.8, 0.13.8, 0.13.9, 0.13.9, 0.14.0, 0.14.0, 0.14.1, 0.14.1, 0.14.2, 0.14.2, 1.0.0, 1.0.0, 1.0.1, 1.0.1, 1.0.2, 1.0.2, 1.0.3, 1.0.3, 1.0.4, 1.0.4, 1.1.0, 1.1.0, 1.2.0, 1.2.0, 1.2.1, 1.2.1, 1.2.2, 1.2.2, 1.2.3, 1.2.3, 2.0.0, 2.0.0, 2.0.0, 2.0.0, 2.0.1, 2.0.1, 2.0.1, 2.0.1, 2.1.0, 2.1.0, 2.1.0, 2.1.0, 2.2.0, 2.2.0, 2.2.0, 2.2.0, 2.2.1, 2.2.1, 2.2.1, 2.2.1, 2.3.0, 2.3.0, 2.3.0, 2.3.0, 2.4.0, 2.4.0, 2.4.0, 2.4.0, 2.4.1, 2.4.1, 2.4.1, 2.4.1, 2.4.2, 2.4.2, 2.4.2, 2.4.2, 2.4.3, 2.4.3, 2.4.3, 2.4.3, 2.5.0, 2.5.0, 2.5.0, 2.5.0, 2.5.1, 2.5.1, 2.5.1, 2.5.1, 2.5.2, 2.5.2, 2.5.2, 2.5.2, 2.5.3, 2.5.3, 2.5.3, 2.5.3, 2.6.0, 2.6.0, 2.6.0, 2.6.0, 2.6.1, 2.6.1, 2.6.1, 2.6.1, 2.6.2, 2.6.2, 2.6.2, 2.6.2, 2.7.0, 2.7.0, 2.7.0, 2.7.0, 2.8.0, 2.8.0, 2.8.0, 2.8.0, 2.8.1, 2.8.1, 2.8.1, 2.8.1, 2.9.0, 2.9.0, 2.9.0, 2.9.0, 2.9.1, 2.9.1, 2.9.1, 2.9.1, 2.9.2, 2.9.2, 2.9.2, 2.9.2, 2.10.0, 2.10.0, 2.10.0, 2.10.0, 2.11.0, 2.11.0, 2.11.0, 2.11.0, 2.11.1, 2.11.1, 2.11.1, 2.11.1, 2.12.0, 2.12.0, 2.12.0, 2.12.0, 2.12.1, 2.12.1, 2.12.1, 2.12.1, 2.12.2, 2.12.2, 2.12.2, 2.12.2, 2.12.3, 2.12.3, 2.12.3, 2.12.3, 2.12.4, 2.12.4, 2.12.4, 2.12.4, 2.12.5, 2.12.5, 2.12.5, 2.12.5, 2.13.0, 2.13.0, 2.13.0, 2.13.0, 2.14.0, 2.14.0, 2.14.0, 2.14.0, 2.14.1, 2.14.1, 2.14.1, 2.14.1, 2.14.2, 2.14.2, 2.14.2, 2.14.2, 2.15.1, 2.15.1, 2.15.1, 2.15.1, 2.16.0, 2.16.0, 2.16.0, 2.16.0, 2.16.1, 2.16.1, 2.16.1, 2.16.1, 2.16.2, 2.16.2, 2.16.2, 2.16.2, 2.16.3, 2.16.3, 2.16.3, 2.16.3, 2.16.4, 2.16.4, 2.16.4, 2.16.4, 2.16.5, 2.16.5, 2.16.5, 2.16.5, 2.17.0, 2.17.0, 2.17.0, 2.17.0, 2.17.1, 2.17.1, 2.17.1, 2.17.1, 2.17.2, 2.17.2, 2.17.2, 2.17.2, 2.17.3, 2.17.3, 2.17.3, 2.17.3, 2.18.0, 2.18.0, 2.18.0, 2.18.0, 2.18.1, 2.18.1, 2.18.1, 2.18.1, 2.18.2, 2.18.2, 2.18.2, 2.18.2, 2.18.3, 2.18.3, 2.18.3, 2.18.3, 2.18.4, 2.18.4, 2.18.4, 2.18.4
@kennethreitz
์๋์. ์๋ฅผ ๋ค์ด, ์ ๋ ์ค๊ตญ์ ์ด๊ณ ์์ต๋๋ค. pypi.python.org์ ๋ํ ์๋๋ ์ผ๋ฐ์ ์ผ๋ก 50k/s๋ณด๋ค ๋ฎ์ต๋๋ค. ๊ธ๋ก๋ฒ ๋์๊ธฐ ๋ฏธ๋ฌ ๋ฅผ ์ค์
File "d:\python27\lib\site-packages\pipenv\patched\pip\_vendor\requests\packages\urllib3\response.
py", line 324, in read
flush_decoder = True
File "d:\python27\lib\contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File "d:\python27\lib\site-packages\pipenv\patched\pip\_vendor\requests\packages\urllib3\response.
py", line 246, in _error_catcher
raise ReadTimeoutError(self._pool, None, 'Read timed out.')
pip._vendor.requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='pypi.py
thon.org', port=443): Read timed out.
๊ทธ๋์, ๋ด๊ฐ pipenv๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค pip.conf[Pipfile]๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ๋ง์ ๋๊น? ์ ์๊ฒ๋ ์ฉ๋ฉํ ์ ์์ต๋๋ค.
์ด๋ฌํ ํญ๋ชฉ์๋ ํ๋ก์ ํธ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์ด๋ํด์ผ ํ๋ Pipfile๋ก ์ด๋ํ์ง ์์ ์๊ฒฉ ์ฆ๋ช ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
@eromoe @hrbonz ๊ทธ๋์ pipenv๊ฐ ์ฌ์ค ์๋ฒ๊ฐ ์๋ pypi๋ฅผ ๋จผ์ ํด๊ฒฐํ๋ ๋ฌธ์ ์ธ๊ฐ์?
์ ์๊ฒ๋ ๊ทธ๋ ์ต๋๋ค. ์ ์ญ ๋ฏธ๋ฌ ์ค์ ์ด ์ ๋ง ํ์ํฉ๋๋ค.
pip.conf๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋จผ์ ์ฌ์ดํธ ์ ์ฒด ํ์ผ์ ์ฝ์ ๋ค์
- ์ฌ์ฉ์๋ณ ํ์ผ์ ์ฝ๊ณ ๋ง์ง๋ง์ผ๋ก
- virtualenv ๊ด๋ จ ํ์ผ์ ์ฝ์ต๋๋ค.
pip.conf๋ฅผ ์กด์คํ๋ฉด pip ์ฌ์ฉ์๊ฐ pipenv๋ก ์ํํ๊ฒ ์ ํํ ์ ์์ต๋๋ค.
๋๋ ์ด๋ฌํ ๊ตฌ์ฑ์ Pipfile
์ ๋ฃ์ ์ ์๋ค๋ ์์ด๋์ด๋ฅผ ์ข์ํ์ง๋ง(๋ค๋ฅธ ๊ฐ๋ฐ์์ ๊ตฌ์ฑ์ ์ฝ๊ฒ ๊ณต์ ํ๊ธฐ ์ํด) pipenv๋ ํ์คํ pip.conf
๋ ์กด์คํด์ผ ํฉ๋๋ค. ํํ์ผ).
@erinxocon ์ด๊ฒ์ ๋ด๊ฐ ์๋ณํ ๋ฌธ์ ์ค ํ๋์ ๋๋ค. ๋๋ ์ผ๋ก ๊ฝค ๋ฐ๋นด์ง๋ง ๋ค์ ์ฃผ ์ ์ ์ฒซ ๋ฒ์งธ PR์ ์ถ์งํ๊ธฐ๋ฅผ ํฌ๋งํฉ๋๋ค.
์๋ ํ์ธ์, @kennethreitz ๋ฉ์ง ํ๋ก์ ํธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ง๋ฌธ์ด ์์ต๋๋ค. ํด๋น ํ ๋ก ์ ๋ ผ์์ด ๋ฐ์ํ ํ ํด๋น ๋ฌธ์ ์ ๋ํ ๊ทํ์ ์ ์ฅ์ ์ฌ๊ณ ํ์๊ฒ ์ต๋๊น?
pip.conf์ ๋งค์ฐ ์ ์ฌํ ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ผ๋ฉฐ ๋ณ๋์ pip.conf ํ์ผ์ ์๊ฒฉ ์ฆ๋ช ์ด ์๋ ๊ฒ์ CI/CD ํ์ดํ๋ผ์ธ ๋ฐ ๋ก์ปฌ ๊ฐ๋ฐ ์์คํ ์์ ์์ธก ๊ฐ๋ฅํ ๋น๋๋ฅผ ๊ฐ๋ ๋ฐ ์ ํจํฉ๋๋ค.
@hrbonz ์ง๊ธ์ pip.conf ํ์ผ์ด pipenv์์ ์ง์๋ ๋๊น์ง pip์์ $PIP_INDEX_URL
env ๋ณ์๋ง ์ฌ์ฉํ๋ ์๋ฃจ์
์ ์ฐพ์์ต๋๋ค. ํด๋น $PIP_VARIABLE
๋ ํ์ฌ .env
ํ์ผ์์ ์์ฑํ ์ ์์ต๋๋ค.
pypa/pip#3728๊ณผ ์ฌ์ฉ์ ์ง์ ์ธ๋ฑ์ค ๋ฅผ ๊ฒฐํฉํ๋ ๊ฒ์ด ์๊ฒฉ ์ฆ๋ช ์ ๋ ธ์ถํ์ง ์๊ณ ๋น๊ณต๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ํ _the_ ์๋ฃจ์ ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ํ #1406์ ๋๊ธ์ ๋จ๊ฒผ์ต๋๋ค.
์์ธ ์ด๋ฆ๊ณผ URL๋ง ํ์ํ ๊ฒฝ์ฐ(์: devpi
) ํ ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ ์์ธ ์ด๋ฆ๊ณผ URL์ด ์์ง๋ง ๊ทธ๋ ์ง ์์ผ๋ฉด ๊นจ๋ํ Pipfile์ ์์ฑํ๊ณ ์ ํ ๋๋ง๋ค ์ด ์
ธ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
pipenv_init() {
# pipenv issue #856: pipenv doesn't respect pip.conf
# https://github.com/pypa/pipenv/issues/856
# This function accepts one optional argument: the path to the pipenv
# executable. If not set or empty, defaults to PATH lookup.
local PIPENV="${1:-pipenv}"
if ! command -v -- "${PIPENV}" > /dev/null; then
>&2 printf '%s\n' 'pipenv not found'
return 1
fi
# Check for required environment variables.
if [[ -z "${PIPENV_INDEX_NAME-}" ]] || [[ -z "${PIPENV_INDEX_URL-}" ]]; then
>&2 printf '%s\n' 'PIPENV_INDEX_{NAME,URL} env vars must be set and not empty'
return 1
fi
# Create fresh Pipfile and virtualenv.
#
# While doing so, move requirements.txt out of the way so pipenv
# doesn't attempt to populate the virtualenv before we have a chance
# to modify Pipfile.
# https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/cli.py#L308-L330
# https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/project.py#L117-L119
# https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/project.py#L231-L240
# https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/utils.py#L1112-L1124
local TEMP_REQUIREMENTS_TXT
"${PIPENV}" --rm || true
rm -f -- Pipfile Pipfile.lock
if [[ -f requirements.txt ]]; then
TEMP_REQUIREMENTS_TXT="$(mktemp)"
mv -- requirements.txt "${TEMP_REQUIREMENTS_TXT}"
fi
"${PIPENV}" install
if [[ -n "${TEMP_REQUIREMENTS_TXT}" ]]; then
mv -- "${TEMP_REQUIREMENTS_TXT}" requirements.txt
fi
rm -- Pipfile.lock
# Within Pipfile's `[[source]]` section, set `name` to
# `${PIPENV_INDEX_NAME}` and `url` to `${PIPENV_INDEX_URL}`.
local TEMP_PIPFILE="$(mktemp)"
< Pipfile \
sed \
-e '/^\[\[source\]\]$/,/^\[/ { s|^\(name = \).*|\1"'"${PIPENV_INDEX_NAME}"'"| ; s|^\(url = \).*|\1"'"${PIPENV_INDEX_URL}"'"| ; }' \
> "${TEMP_PIPFILE}"
mv -- "${TEMP_PIPFILE}" Pipfile
}
์ ์ฌ, ์ง์งํ๊ฒ. ์ด ๋ฌธ์ ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฐ๋ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
pipenv๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค. ๋๋ ์ง๊ณผ ์ง์ฅ์์ ์ด ํ๋ก์ ํธ๋ฅผ ์๋๋ค.
์ง์์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ง์ฅ์์๋ ๋ด๋ถ pipy ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Pipfile์ด ์ปค๋ฐ๋๊ณ git์ ํธ์๋๋ฏ๋ก ์ง์์ ์ง์ฅ์ผ๋ก ์ด๋ํ ๋ ๊ณ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํจ์ pipenv์ ์๋ฆฌ๋ ์ธ๋ถ ๊ตฌ์ฑ์ ๊ฐ๊ณ ์ถ์ต๋๋ค.
์ด ๊ตฌ์ฑ์ Pipfile ์์ ๋ฃ์ผ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
@hrbonz @ninrod @GhostofGoes #1769 ๋ฐ #1809์์ ์์ ๋จ -- Pipfiles์ ํ๊ฒฝ ๋ณ์๊ฐ ์ด์ ๋ฐํ์ ์ ํ์ฅ๋จ
์ํดํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฐ๋ฆฌ์ ์ต์ฐ์ ์์๋ ์ฝ๋๋ฒ ์ด์ค์ ํต์ฌ ๊ธฐ๋ฅ์ด์์ต๋๋ค. ๋ฐ๋ผ์ ์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๊ณผํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ์ฐ์ ์์๊ฐ ์ง์ ๋์ง ์์ ํญ๋ชฉ์ ๋ํ ๊ธฐ์ฌ์ ๋ํด ๋ ผ์ํ๊ฒ ๋์ด ํญ์ ๊ธฐ์ฉ๋๋ค!
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ ์ผํ ๋์์ ๋ชจ๋ ํธ๋ํฝ์ด PyPi์ ๋ด๋ถ ๋ฏธ๋ฌ(์: Artifactory ๋๋ ๊ธฐํ ๋ฑ๋ฑ)๋ก ์ ๋ฌ๋๋๋ก PyPi URL์ ์ฌ์ ์ํ๋ ๊ฒ์ ๋๋ค. ์ด์จ๋ PyPi๋ ๋ด๋ถ์ ์ผ๋ก ์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๋ฌํ ํญ๋ชฉ์๋ ํ๋ก์ ํธ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์ด๋ํด์ผ ํ๋ Pipfile๋ก ์ด๋ํ์ง ์์ ์๊ฒฉ ์ฆ๋ช ์ด ํฌํจ๋ ์ ์์ต๋๋ค.