Pipenv: Pipfile.lock . рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 31 рдЬрдире░ 2019  ┬╖  25рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pypa/pipenv

рд▓реЙрдХ рдХрд┐рдП рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ 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

рд╕рднреА 25 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдкрд┐рдкреЗрдирд╡ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЖрдк рдЕрдиреНрдп рдкрд╛рдЗрдкрдлрд╛рдЗрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рдЗрдкрдлрд╛рдЗрд▓-рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рддреБрдо рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реЛ

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 . рд╕реЗ 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

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

AkiraSama picture AkiraSama  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jerzyk picture jerzyk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

erinxocon picture erinxocon  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

FooBarQuaxx picture FooBarQuaxx  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jeyraof picture jeyraof  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ