рд▓реЙрдХ рдХрд┐рдП рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ Pipfile.lock
рд╕реЗ requirements.txt
рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ?
рдЬрдм рдореИрдВ pipenv lock -r
рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдореМрдЬреВрджрд╛ Pipfile.lock
рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рд▓реЙрдХрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╛рдп рд╣реИ:
$ pipenv sync
$ pipenv run pip freeze
рдореЗрд░реА рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореИрдВ рдбреЛрдХрд░ рдЫрд╡рд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдФрд░ requirements.txt
рдореЗрдВ Dockerfile
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рдХреЗрд╡рд▓ requirements.txt
рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдкрд┐рдкреЗрдирд╡ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЖрдк рдЕрдиреНрдп рдкрд╛рдЗрдкрдлрд╛рдЗрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рдЗрдкрдлрд╛рдЗрд▓-рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рддреБрдо рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реЛ
pipenv run pip freeze > requirements.txt
рддреБрдо рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реЛ
pipenv run pip freeze > requirements.txt
рдореИрдВрдиреЗ рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдкрдХрд╛ рдкрд┐рдкреЗрдирд╡ рд╡рд╛рддрд╛рд╡рд░рдг рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реЛ (рд╕рднреА рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ)ред
Pipfile.lock
рд╕реЗ рд╕реАрдзреЗ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рдХрд╛рд▓рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:
jq -r '.default
| to_entries[]
| .key + .value.version' \
Pipfile.lock > requirements.txt
рдпреЛрдЧреНрдп, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
рдореИрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд░рдЦрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ред рд╕рд╛рде рд╣реА, рдЗрд╕ рдмрд╛рдд рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЯреАрдо рдХреЗ рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА jq
рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдЙрдкрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рд╣реЛред
рддреБрдо рджреМрдбрд╝ рднреА рд╕рдХрддреЗ рд╣реЛ
pipenv lock --requirements > requirements.txt
рдпрд╣ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ:
рдЬрдм рдореИрдВ
pipenv lock -r
рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдореМрдЬреВрджрд╛Pipfile.lock
рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рд▓реЙрдХрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рддрд░рдг рдХреЛ рдирд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП, рдЖрдк requirements.txt
рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Dockerfile рдореЗрдВ рдПрдХ docker рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк requirements.txt
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pipenv lock
$ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЕрд╕рдВрдЧрдд рдпрд╛ рдХреЗрд╡рд▓ рдЯреВрдЯреЗ рд╣реБрдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (рдЙрдореНрдореАрдж рд╣реИ, рдпрд╣ рдПрдХ рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐)ред рдФрд░ рдЗрдореЗрдЬ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ pipenv lock
рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдлрд┐рд░ рд╕реЗ рдРрдк рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдЖрдк jq
рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ pipenv sync
(рдЬреЛ рдЕрджреНрдпрддрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдмреЗрд╣рддрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
@Zebradil рдЖрдкрдХрд╛ jq
oneliner рджреГрд╖реНрдЯрд┐рдХреЛрдг @frostming рдХреЗ рдЕрдкрдиреЗ pipfile-requirements
рдкреИрдХреЗрдЬ (100+ рд▓рд╛рдЗрди рдкрд╛рдпрдерди рдХреЛрдб) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА jq
рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдХреЛрдИ рдЕрдиреНрдп рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдЧрд┐рдЯ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ 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
рдкреАрдЫреЗ flask-sqlalchemy
рд╣реИ, рдЬреЛ Pipfile.lock
рдореЗрдВ рдСрд░реНрдбрд░ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдпрд╣ рдПрдХ рдмрдбрд╝реА рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдиреНрдпреВрдирддрдо git diff рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ pipenv
рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИредрд╣рд╛рдп @ye , рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдЪреНрдЫреА рддреБрд▓рдирд╛ред рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рдЪреБрдирдиреЗ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг jq
рдХреЗ рд╕рд╛рде рд╕реАрдорд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдкреИрдХреЗрдЬ рдЗрдВрдбреЗрдХреНрд╕ рдпреВрдЖрд░рдПрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рдЗрд╕рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЙрддреНрдкрдиреНрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдЕрдВрддрд░ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рд░ рдмрд╛рд░ рдПрдХ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реА рддрд░рд╣, рд╡рд┐рднрд┐рдиреНрди рдХреЛрдб рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрд╕рдВрдЧрдд рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред
рддреБрдо рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реЛ
pipenv run pip freeze > requirements.txt
рдореИрдВрдиреЗ рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдкрдХрд╛ рдкрд┐рдкреЗрдирд╡ рд╡рд╛рддрд╛рд╡рд░рдг рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реЛ (рд╕рднреА рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ)ред
Pipfile.lock
рд╕реЗ рд╕реАрдзреЗ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рдХрд╛рд▓рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:jq -r '.default | to_entries[] | .key + .value.version' \ Pipfile.lock > requirements.txt
рдирдорд╕реНрддреЗ,
рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ pipenv lock -r
рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕реНрд░реЛрддреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛рдиреА: -i, --extra-index-urlред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдирд┐рдЬреА рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред
@Zebradil рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдЬрдЧрд░ рдореЗрдВ рдЕрднреА рддрдХ рдПрдХ рдФрд░ рдиреНрдпреВрдирддрдо рдиреЛ-рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ env vars рдХрд╛ рднреА рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЕрдкрдиреЗ Pipfile рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред
рдЕрдЧрд░ рдХреЛрдИ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛: https://gist.github.com/rcastil/dab85c234dd10fa7af56755116c75aee
рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╣реИрд╢ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
jq --raw-output '.default | to_entries[] | .key + .value.version + (.value.hashes | map(" --hash=\(.)") | join(""))' Pipfile.lock
рдпрд╣ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рдмрдирд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ
paramiko==2.6.0 --hash=sha256:99f0179bdc176281d21961a003ffdb2ec369daac1a1007241f53374e376576cf --hash=sha256:f4b2edfa0d226b70bd4ca31ea7e389325990283da23465d572ed
рдЬреЛ 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
рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ require.txt рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдорд┐рд╢реНрд░рд┐рдд рдХреЗрд╕ рдкреИрдХреЗрдЬ рдирд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди pipenv install -r requirements.txt
рдЙрдиреНрд╣реЗрдВ рдкрд┐рдкрдлрд╛рдЗрд▓ рдореЗрдВ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк Pipfile
(рд▓реЙрдХ-рдлрд╛рдЗрд▓ рдирд╣реАрдВ) рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ.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 lock -r
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
@frostming рдореБрдЭреЗ рдпрд╣ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ pipfile.lock рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
pipenv lock -r
рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ pipfile.lock рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рдпрддрд╛рддреНрдордХ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред pipenv lock -r --ignore-pipfile
рдЬреИрд╕рд╛ рдХреБрдЫ рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛ред
рд╣реИрд╢ рдХреЗ рд╕рд╛рде Pipfile.lock рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ.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()
@ рдЬрд╝реЗрдмреНрд░рд╛рджрд┐рд▓ рдзрдиреНрдпрд╡рд╛рдж! рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
jq
рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ brew install 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 рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ,
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
рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рд╣реИрд╢ рдХреЛ рдкрд┐рдкрдлрд╛рдЗрд▓ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ.txt рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо str рдЬреИрд╕рд╛ рдХреБрдЫ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рддрд╛рдХрд┐ pip install --require-hashes
рдХрд╛рдо рдХрд░реЗ?
$ 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.
рдЖрдк micropipenv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ Pipenv.lock (рдХрд╡рд┐рддрд╛.рд▓реЙрдХ) рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ.txt (рдХрдЪреНрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБред txt рдпрд╛ pip-tools рд╕рдВрдЧрдд) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рджреЗрдЦреЗрдВ https://github.com/thoth-station/micropipenv/#micropipenv -requirements--micropipenv-req
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рддреБрдо рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реЛ