Pipenv: Pipfile.lockμ—μ„œ requirements.txt 생성

에 λ§Œλ“  2019λ…„ 01μ›” 31일  Β·  25μ½”λ©˜νŠΈ  Β·  좜처: pypa/pipenv

μž κ·Έμ§€ μ•Šκ³  κΈ°μ‘΄ Pipfile.lock μ—μ„œ requirements.txt νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?
pipenv lock -r λ₯Ό μ‹€ν–‰ν•˜λ©΄ κΈ°μ‘΄ Pipfile.lock λ₯Ό λ¬΄μ‹œν•˜κ³  λ‹€μ‹œ 잠금 ν”„λ‘œμ„ΈμŠ€λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

이에 λŒ€ν•œ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆλ‹€.

$ pipenv sync
$ pipenv run pip freeze

λ‚΄ νŠΉμ • μƒν™©μ—μ„œ λ‚˜λŠ” 도컀 이미지λ₯Ό λ§Œλ“€κ³  requirements.txt in Dockerfile λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. requirements.txt λ₯Ό 생성할 수 μžˆλ„λ‘ 호슀트 머신에 가상 ν™˜κ²½μ„ μƒμ„±ν•˜λŠ” 것을 ν”Όν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

당신은 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€

pipenv run pip freeze > requirements.txt

λͺ¨λ“  25 λŒ“κΈ€

PipenvλŠ” 이에 λŒ€ν•œ 방법을 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. pipfile-requirements 와 같은 λ‹€λ₯Έ pipfile μœ ν‹Έλ¦¬ν‹° 라이브러리λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

당신은 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€

pipenv run pip freeze > requirements.txt

당신은 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€

pipenv run pip freeze > requirements.txt

그것이 첫 번째 κ²Œμ‹œλ¬Όμ—μ„œ ν•΄κ²° λ°©λ²•μœΌλ‘œ μ–ΈκΈ‰ ν•œ κ²ƒμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이것은 pipenv ν™˜κ²½μ΄ λ™κΈ°ν™”λœ κ²½μš°μ—λ§Œ μž‘λ™ν•©λ‹ˆλ‹€(λͺ¨λ“  νŒ¨ν‚€μ§€κ°€ μ„€μΉ˜λ¨).
Pipfile.lock μ—μ„œ 직접 쒅속성을 μΆ”μΆœν•˜λŠ” 것이 더 νŽΈλ¦¬ν•©λ‹ˆλ‹€.

jq -r '.default
        | to_entries[]
        | .key + .value.version' \
    Pipfile.lock > requirements.txt

λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Ό
jq 도ꡬ

LOL, λ‚˜λŠ” 이미 κ·Έ λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•΄ μ–ΈκΈ‰ν–ˆμŠ΅λ‹ˆλ‹€.

μ €λŠ” 개인적으둜 μ „μš© λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μžˆλŠ” 것을 μ‹«μ–΄ν•©λ‹ˆλ‹€. λ˜ν•œ νŒ€μ›μ΄ 이미 jq λ˜λŠ” 기타 λ²”μš© 도ꡬλ₯Ό μ„€μΉ˜ν–ˆμ„ κ°€λŠ₯성이 더 λ†’μŠ΅λ‹ˆλ‹€.

당신은 심지어 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€

 pipenv lock --requirements > requirements.txt

λ‚΄κ°€ μ“΄ κ²ƒμ²˜λŸΌ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

pipenv lock -r λ₯Ό μ‹€ν–‰ν•˜λ©΄ κΈ°μ‘΄ Pipfile.lock λ₯Ό λ¬΄μ‹œν•˜κ³  λ‹€μ‹œ 잠금 ν”„λ‘œμ„ΈμŠ€λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

즉, μ—…λ°μ΄νŠΈλ₯Ό μˆ˜ν–‰ν•˜μ—¬ 잠재적으둜 배포λ₯Ό νŒŒκ΄΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. requirements.txt λ₯Ό μƒμ„±ν•˜μ—¬ Dockerfileμ—μ„œ 도컀 이미지λ₯Ό λΉŒλ“œν•˜λŠ” 데 μ‚¬μš©ν•œλ‹€κ³  상상해 λ³΄μ‹­μ‹œμ˜€. μ‘μš© ν”„λ‘œκ·Έλž¨μ€ λ‘œμ»¬μ—μ„œ μž‘λ™ν•˜μ§€λ§Œ pipenv lock #$ λ₯Ό μ‚¬μš©ν•˜μ—¬ $ requirements.txt λ₯Ό μƒμ„±ν•˜λ©΄ μš”κ΅¬ 사항이 ν˜Έν™˜λ˜μ§€ μ•Šκ±°λ‚˜ μ†μƒλœ λ²„μ „μœΌλ‘œ μ—…λ°μ΄νŠΈλ  수 μžˆμŠ΅λ‹ˆλ‹€(ν¬κ·€ν•œ κ²½μš°μ΄μ§€λ§Œ). 그리고 당신은 이미지λ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 이것을 μ•Œμ§€ λͺ»ν•  κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ pipenv lock λ₯Ό μ‹€ν–‰ν•œ ν›„ 앱을 λ‹€μ‹œ ν…ŒμŠ€νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€.

jq λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ €λ©΄ pipenv sync (μ—…λ°μ΄νŠΈν•˜μ§€ μ•ŠμŒ)둜 첫 번째 κ²Œμ‹œλ¬Όμ—μ„œ μ œμ•ˆν•œ μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

@Zebradil κ·€ν•˜μ˜ jq oneliner μ ‘κ·Ό 방식은 이미 jq λ₯Ό μ„€μΉ˜ν–ˆκΈ° λ•Œλ¬Έμ— @frostming 자체 pipfile-requirements νŒ¨ν‚€μ§€(100개 μ΄μƒμ˜ 라인 파이썬 μ½”λ“œ)보닀 훨씬 κ°„λ‹¨ν•©λ‹ˆλ‹€. λ‹€λ₯Έ 쒅속성은 μ—†μŠ΅λ‹ˆλ‹€. ν•„μˆ˜μž…λ‹ˆλ‹€. ν›Œλ₯­ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λͺ‡ 가지 git 컀밋 후에 pipenv lock --requirements 좜λ ₯κ³Ό jq Pipfile.lock νŒŒμΌμ„ 톡해 μˆ˜μ§‘ν•˜κ³  좜λ ₯ν•˜λŠ” κ²ƒμ˜ 차이점을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

  • jq 좜λ ₯μ—λŠ” -i https://pypi.org/simple κ°€ 맨 처음 ν–‰μœΌλ‘œ ν¬ν•¨λ˜μ§€ μ•Šκ³  pipenv lock --r κ°€ 항상 맨 처음 ν–‰μœΌλ‘œ μ‚½μž…λ˜λŠ” κ²ƒκ³ΌλŠ” λŒ€μ‘°μ μž…λ‹ˆλ‹€.
  • jq 좜λ ₯μ—λŠ” νŒ¨ν‚€μ§€μ— λŒ€ν•œ 주석이 ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 예: pipenv lock --r 좜λ ₯μ—λŠ” appnope==0.1.0 ; sys_platform == 'darwin' 행이 μžˆμ§€λ§Œ jq 좜λ ₯μ—μ„œλŠ” appnope==0.1.0 μž…λ‹ˆλ‹€. 또 λ‹€λ₯Έ μ˜ˆλŠ” pipenv lock -r κ°€ pexpect==4.7.0 ; sys_platform != 'win32' $λ₯Ό μƒμ„±ν•˜λŠ” 반면 jq λŠ” pexpect==4.7.0 $λ₯Ό μƒμ„±ν•˜λŠ”λ° 이것이 μ€‘μš”ν•œμ§€ μ•„λ‹Œμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μš”κ΅¬ 사항 파일 νŒ¨ν‚€μ§€ μˆœμ„œλŠ” 두 좜λ ₯ 간에 λ‹€λ¦…λ‹ˆλ‹€. jq Pipfile.lock νŒŒμΌμ—μ„œ νŒ¨ν‚€μ§€ μˆœμ„œλ₯Ό μ·¨ν•˜λŠ” κ²ƒμœΌλ‘œ μΆ”μ •λ˜λ©° 항상 μ•ŒνŒŒλ²³κ³Ό 문자 길이의 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ flask λŠ” flask-sqlalchemy μ•žμ— μžˆμŠ΅λ‹ˆλ‹€. flask-XXXXX νŒ¨ν‚€μ§€μΈ 반면 pipenv lock --r $ λŠ” flask-sqlalchemy flask $ λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€. μ΄λŠ” Pipfile.lock 의 μˆœμ„œμ™€ λ‹€λ¦…λ‹ˆλ‹€. 이것은 μ΅œμ†Œ git diffλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ£Όμš” μ„±κ°€μ‹¬μž…λ‹ˆλ‹€. λ‚˜λŠ” 이것이 pipenv 의 버그라고 μƒκ°ν•©λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @yeλ‹˜ , 방법을 잘 λΉ„κ΅ν–ˆμŠ΅λ‹ˆλ‹€. μ‚¬λžŒλ“€μ΄ νŠΉμ • 상황에 μ ν•©ν•œ μ†”λ£¨μ…˜μ„ μ„ νƒν•˜κ³  κ²½κ³ λ₯Ό ν”Όν•˜λŠ” 데 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

λ„€, λ§μ”€ν•˜μ‹  κ²ƒμ²˜λŸΌ jq 둜 μ œμ•ˆλœ μ ‘κ·Ό 방식은 κΈ°λŠ₯이 μ œν•œμ μž…λ‹ˆλ‹€. 주석 및 νŒ¨ν‚€μ§€ 색인 URL을 μΆ”κ°€ν•˜λ„λ‘ ν™•μž₯ν•  수 μžˆμ§€λ§Œ μ§€κΈˆμ€ 그럴 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μƒμ„±λœ requirements.txt에 차이가 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•˜λ €λ©΄ 맀번 λ™μΌν•œ μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λŠ” 것을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ λ‹€λ₯Έ μ½”λ“œ μ„œμ‹ 지정 도ꡬλ₯Ό μ‚¬μš©ν•˜λ©΄ κ²°κ³Όκ°€ μΌκ΄€λ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ €λŠ” 여기에 λ¬Έμ œκ°€ μ—†λ‹€κ³  λ΄…λ‹ˆλ‹€.

당신은 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€

pipenv run pip freeze > requirements.txt

그것이 첫 번째 κ²Œμ‹œλ¬Όμ—μ„œ ν•΄κ²° λ°©λ²•μœΌλ‘œ μ–ΈκΈ‰ ν•œ κ²ƒμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이것은 pipenv ν™˜κ²½μ΄ λ™κΈ°ν™”λœ κ²½μš°μ—λ§Œ μž‘λ™ν•©λ‹ˆλ‹€(λͺ¨λ“  νŒ¨ν‚€μ§€κ°€ μ„€μΉ˜λ¨).
Pipfile.lock μ—μ„œ 직접 쒅속성을 μΆ”μΆœν•˜λŠ” 것이 더 νŽΈλ¦¬ν•©λ‹ˆλ‹€.

jq -r '.default
        | to_entries[]
        | .key + .value.version' \
    Pipfile.lock > requirements.txt

λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Ό
jq 도ꡬ

μ•ˆλ…•,

μ†”λ£¨μ…˜μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. λ‚˜λŠ” 같은 λ¬Έμ œμ— λΆ€λ”ͺ쳀지 pipenv lock -r 에 μ˜ν•΄ μƒμ„±λœ μ†ŒμŠ€μ˜ μ •μ˜λ„ ν•„μš”ν•©λ‹ˆλ‹€. 예: -i, --extra-index-url. 개인 μ†ŒμŠ€λ‘œ μž‘μ—…ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

@Zebradil λ§μ”€ν•˜μ‹  것 κ°™μ€λ°μš”.

κ·Έλž˜μ„œ νŒŒμ΄μ¬μ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 ν¬ν•¨ν•˜λŠ” 또 λ‹€λ₯Έ μ΅œμ†Œν•œ 의 쒅속성 μ—†λŠ” 슀크립트λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ Pipfileμ—μ„œ μ†ŒμŠ€λ₯Ό κ·Έλ ‡κ²Œ μ •μ˜ν•œ 경우 env varsλ₯Ό ν™•μž₯ν•©λ‹ˆλ‹€.

λˆ„κ΅¬λ“ μ§€ μ‚΄νŽ΄λ³΄κ³  μ‹Άλ‹€λ©΄ 여기에 남겨 λ‘κ² μŠ΅λ‹ˆλ‹€. https://gist.github.com/rcastill/dab85c234dd10fa7af56755116c75aee

λ‹€λ₯Έ μ‚¬λžŒμ—κ²Œ 도움이 λ˜λŠ” 경우 결과에 ν•΄μ‹œλ₯Ό ν¬ν•¨ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 jq --raw-output '.default | to_entries[] | .key + .value.version + (.value.hashes | map(" --hash=\(.)") | join(""))' Pipfile.lock

μ΄λ ‡κ²Œ ν•˜λ©΄ λ‹€μŒκ³Ό 같은 ν•­λͺ©μ΄ μƒμ„±λ©λ‹ˆλ‹€.

paramiko==2.6.0 --hash=sha256:99f0179bdc176281d21961a003ffdb2ec369daac1a1007241f53374e3766576cf --hash=sha256:f4b2edfa0d226b

pip κ°€ ν•΄μ‹œλ₯Ό μ μš©ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

μ›λž˜ μš”κ΅¬ 사항 νŒŒμΌμ— 있던 μš”κ΅¬ μ‚¬ν•­λ§Œ ν¬ν•¨ν•˜λ €λŠ” 경우( == λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • 버전에 이미 잠겨 μžˆλŠ” 경우):

 jq --raw-output '.default | to_entries[] | .key + .value.version + (.value.hashes | map(" --hash=\(.)") | join(""))' Pipfile.lock | grep --file=<(grep --only-matching --perl-regexp '^.*(?===)' requirements.txt | tr '[:upper:]' '[:lower:]') > new.txt && mv new.txt requirements.txt

tr λŠ” requirements.txt νŒŒμΌμ— λŒ€μ†Œλ¬Έμžκ°€ ν˜Όν•©λœ νŒ¨ν‚€μ§€ 이름이 포함될 수 μžˆμ§€λ§Œ Pipfileμ—μ„œ pipenv install -r requirements.txt κ°€ μ†Œλ¬Έμžμ΄κΈ° λ•Œλ¬Έμ— ν•„μš”ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ Pipfile (잠금 파일 μ•„λ‹˜)λ₯Ό requirements.txt 파일둜 λ³€ν™˜ν•˜λ €λŠ” 경우λ₯Ό μœ„ν•œ μž‘μ€ 파이썬 μŠ€ν¬λ¦½νŠΈμž…λ‹ˆλ‹€.

import configparser


def main():
    parser = configparser.ConfigParser()
    parser.read("Pipfile")

    packages = "packages"
    with open("requirements.txt", "w") as f:
        for key in parser[packages]:
            value = parser[packages][key]
            f.write(key + value.replace("\"", "") + "\n")


if __name__ == "__main__":
    main()

@frostming μ•ˆλ…•ν•˜μ„Έμš”, https://github.com/frostming/pipfile-requirements κ°€ μœ μš©ν•˜μ§€λ§Œ μ™œ pipenv에 ν†΅ν•©λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆκΉŒ?

@linusguan 이 λ„κ΅¬λŠ” 큰 pipenv 라이브러리λ₯Ό μ„€μΉ˜ν•˜κ³  싢지 μ•Šμ€ μ‚¬λžŒλ“€μ„ μœ„ν•΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. pipenvλ₯Ό μ„€μΉ˜ν•  λ•Œ pipenv lock -r λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@frostming pipfile.lock 을 μ§€μ›ν•˜μ§€ μ•ŠλŠ” λ‹€λ₯Έ 도ꡬ와 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 것이 맀우 μœ μš©ν•˜λ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.
pipenv lock -r 의 λ¬Έμ œλŠ” pipfile.lock을 μ—…λ°μ΄νŠΈν•˜λ―€λ‘œ λ‹€λ₯Έ 도ꡬ와 ν•¨κ»˜ 결정적 λΉŒλ“œλ₯Ό μƒμ„±ν•˜λŠ” 데 μ‚¬μš©ν•  수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. pipenv lock -r --ignore-pipfile 와 같은 것이 μ΄μƒμ μž…λ‹ˆλ‹€.

λ‹€μŒμ€ ν•΄μ‹œκ°€ μžˆλŠ” Pipfile.lock νŒŒμΌμ—μ„œ requirements.txtλ₯Ό μƒμ„±ν•˜λŠ” 또 λ‹€λ₯Έ 파이썬 μŠ€ν¬λ¦½νŠΈμž…λ‹ˆλ‹€.

import os
import json

__dir__ = os.path.dirname(os.path.realpath(__file__))


def read_json_file(path):
    with open(path) as f:
        return json.load(f)


def main():
    root = read_json_file(os.path.join(__dir__, 'Pipfile.lock'))

    for name, pkg in root["default"].items():
        version = pkg["version"]
        sep = lambda i: "" if i == len(pkg["hashes"]) - 1 else " \\"
        hashes = [f'--hash={t}{sep(i)}' for i, t in enumerate(pkg["hashes"])]
        tail = '' if len(hashes) == 0 else f' {hashes[0]}'
        print(f'{name} {version}{tail}')
        for h in hashes[1:]:
            print(f'    {h}')


if __name__ == "__main__":
    main()

@Zebradil κ°μ‚¬ν•©λ‹ˆλ‹€! κ·€ν•˜μ˜ μ†”λ£¨μ…˜μ€ 정말 μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

  • λ¨Όμ € brew install jq λ₯Ό μ‚¬μš©ν•˜μ—¬ $ jq 도ꡬλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.
  • 그런 λ‹€μŒ 슀크립트λ₯Ό μ‚¬μš©ν•˜μ—¬ Pipfile.lock requirements.txt λ₯Ό μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.

--keep-outdated ν”Œλž˜κ·Έλ‘œ ν•΄κ²°ν•  수 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ•„λ‹ˆλ©΄ μ œκ°€ 잘λͺ» μ•Œκ³  μžˆλŠ” κ²ƒμž…λ‹ˆκΉŒ?

pipenv lock --keep-outdated -d -r > requirements.txt

μΆ”μ‹ : 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ§œμ¦λ‚˜κ²Œ μž₯ν™©ν•œ ν”Œλž˜κ·Έμž…λ‹ˆλ‹€.

λΆˆν–‰νžˆλ„ @jacobisaliveandwell --keep-outdated ν”Œλž˜κ·Έκ°€ ν•˜μœ„ 쒅속성을 μ—…λ°μ΄νŠΈν•˜λŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. https://github.com/pypa/pipenv/issues/3975

@paytonrules λ²„κ·Έμ§€λ§Œ ν”Œλž˜κ·Έμ˜ 정신은 μ—¬μ „νžˆ ​​이 λ¬Έμ œμ— λŒ€ν•œ λ‹΅μž…λ‹ˆλ‹€.

μΆ”μ‹ : 그것에 λŒ€ν•΄ 엄지손가락을 치울 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€ :-(

λͺ…μ‹œλœ ν•΄κ²° 방법과 차이점이 μžˆμŒμ„ μ–ΈκΈ‰ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.
pipenv run pip freeze λŠ” λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜λŠ” νŒ¨ν‚€μ§€ 이름을 λ°˜ν™˜ν•©λ‹ˆλ‹€(예: PyYAML ).
pipenv lock --requirements λŠ” λͺ¨λ“  μ†Œλ¬Έμž νŒ¨ν‚€μ§€ 이름을 λ°˜ν™˜ν•©λ‹ˆλ‹€(예: pyyaml ).

@Darkless012 이λ₯Ό μ„€λͺ…ν•˜λŠ” λ‹€λ₯Έ 티켓을 μ—΄κ³  이 문제λ₯Ό κ΄€λ ¨μœΌλ‘œ μ°Έμ‘°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λˆ„κ΅°κ°€κ°€ jqλ₯Ό μ„€μΉ˜ν•  수 μ—†κ±°λ‚˜ μ„€μΉ˜ν•˜κΈ°λ₯Ό μ›ν•˜μ§€ μ•ŠλŠ” 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ μˆœμˆ˜ν•œ bash, νŒ¨ν‚€μ§€λ§Œ, λ‹€λ₯Έ 것은 μ—†μŠ΅λ‹ˆλ‹€.

cat Pipfile.lock \
  | grep -B1 '"hashes"\|"version": ' \
  | grep -v '"markers": \|"hashes": ' \
  | grep ": {\|version" \
  | sed -e 's/: {$//g' \
  | tr '\n' ',' | tr -s ' ' ' ' \
  | sed -e 's/, "version": "//g;s/", "/ /g;s/"//g;s/,//g' \
  | tr ' ' '\n' \
| grep -v "^$" > requirements.txt

pip install --require-hashes κ°€ μž‘λ™ν•˜λ„λ‘ Pipfile의 ν•΄μ‹œλ₯Ό requirements.txt(예: ν”Œλž«νΌ strκ³Ό 같은 κ²ƒμœΌλ‘œ 제곡)둜 λ³΅μ‚¬ν•˜λŠ” 것이 μžˆμŠ΅λ‹ˆκΉŒ?

$ pip install --help
# ...
  --require-hashes            Require a hash to check each requirement against, for repeatable installs. This option is implied when any package in a
                              requirements file has a --hash option.

Pipenv.lock(poety.lock도 포함) νŒŒμΌμ„ requirements.txt(raw requirements.txt λ˜λŠ” pip-tools ν˜Έν™˜ κ°€λŠ₯)둜 λ³€ν™˜ν•  수 μžˆλŠ” micropipenvλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. https://github.com/thoth-station/micropipenv/#micropipenv -requirements--micropipenv-req μ°Έμ‘°

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰