Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Brug pipenv Pipfiles i stedet for requirements.txt #26

Open
tyilo opened this issue Jan 29, 2018 · 15 comments
Open

Brug pipenv Pipfiles i stedet for requirements.txt #26

tyilo opened this issue Jan 29, 2018 · 15 comments

Comments

@tyilo
Copy link
Member

tyilo commented Jan 29, 2018

Jeg synes vi skal bruge Pipfiles i stedet for requirements.txt i vores forskellige repos.

Pros:

  • Separerer hvilke packages vi skal bruge direkte og hvilke der bare er en dependency af en anden package
  • Laver automatiske lock files, så man altid får samme version af all packages i alle miljøer
  • Automatisk administrering af venvs

Cons:

  • Kræver installation før brug (pip install pipenv)
  • ???

Hvad tænker I andre?

@tyilo
Copy link
Member Author

tyilo commented Jan 31, 2018

@Mortal @neic ping :)

@Mortal
Copy link

Mortal commented Feb 6, 2018

Det lader til at det for nylig er blevet den officielle måde at gøre tingene på, og jeg har prøvet at bruge det i et lille projekt, hvor det fungerer fint. Vi skal bare have committet Pipfile og Pipfile.lock i hver repo og skrevet en instruks i hver README at man skal pip install pipenv og bruge pipenv install --three for at sætte et venv op og pipenv shell for at aktivere venv'et (i en ny shell-proces, i modsætning til . venv/bin/activate fremgangsmåden).

@neic
Copy link
Member

neic commented Feb 12, 2018

Jeg har ikke haft tid til at kigge på det i dybden, men fra readme filen ser det fornuftigt ud.

@neic neic added the tech debt label Jun 3, 2018
@Mortal
Copy link

Mortal commented Jul 2, 2018

@tyilo Vil du lave Pipfiles til vores repos? Jeg har kigget https://github.com/TK-IT/web/blob/master/requirements.txt igennem, og jeg tror følgende dependencies bliver brugt direkte af os:

django>=1.11,<1.11.99
pillow>=2.6,<=5.0.0
sorl-thumbnail>=12.3
django-versatileimagefield>=1.6
git+https://github.com/CalPolyResDev/django-jfu#egg=django-jfu  # tkweb/apps/gallery/
django-bootstrap3>=6.2.2
icalendar>=3.9.1
django-constance[database]>=1.1.1
django-macros>=0.4.0  # {% load repeatedblocks %}
unidecode>=0.04.19
mysqlclient>=1.3.7
django-multiupload==0.5.2  # tkweb/apps/mailinglist/
git+https://github.com/TK-IT/[email protected]#egg=tktitler
git+https://github.com/django-wiki/django-wiki.git#egg=wiki # django-wiki>=0.4a3 is needed
django-mediumeditor==0.2.0  # tkweb/apps/regnskab/
jsonfield  # tkweb/apps/regnskab/
html2text  # tkweb/apps/regnskab/
numpy  # tkweb/apps/regnskab/
scipy  # tkweb/apps/regnskab/
matplotlib  # tkweb/apps/regnskab/

Og følgende er ikke brugt direkte af os, men er blot afledt af ovenstående dependencies:

pytz>=2015.2
django-cleanup>=0.4.2
django-model-utils>=2.5

@tyilo
Copy link
Member Author

tyilo commented Jul 2, 2018

Hvilken version af python bruger vi i production? (Nyere Pipfiles indeholder specifik version, f.eks. "3.5" eller "3.7")

@neic
Copy link
Member

neic commented Jul 2, 2018

@tyilo

(tkweb-prod) neic@prodekanus:/home/tkammer/tkweb$ python --version
Python 3.5.2

Men det skulle vel ikke være et problem at bruge 3.6? (3.7 er måske lige ny nok)

@tyilo
Copy link
Member Author

tyilo commented Jul 2, 2018

Næ, men det kræver jo bare at 3.6 er installeret på serveren.

@Mortal
Copy link

Mortal commented Jul 2, 2018

Understøtter pipenv at man installerer en Python 3.5 Pipfile i et Python 3.6 venv? Ellers bliver det træls for tkweb-udviklere der ikke har Python 3.5 installeret...

@tyilo
Copy link
Member Author

tyilo commented Jul 2, 2018

Det ser ud til at man bare kan fjerne

[requires]
python_version = "3.5"

Det ser dog ikke ud til at man kan specificere mindst version 3.5: pypa/pipenv#1071

@tyilo
Copy link
Member Author

tyilo commented Jul 2, 2018

I følge pipenv graph er dependency grafen:

django-bootstrap3==10.0.1
django-cleanup==2.1.0
django-constance==2.2.0
django-jfu==2.0.9
django-macros==0.4.0
  - django [required: >=1.6, installed: 1.11.14]
    - pytz [required: Any, installed: 2018.5]
django-mediumeditor==0.2.0
  - django-appconf [required: >=1.0.2, installed: 1.0.2]
django-model-utils==3.1.2
  - Django [required: >=1.8, installed: 1.11.14]
    - pytz [required: Any, installed: 2018.5]
django-multiupload==0.5.2
  - django [required: Any, installed: 1.11.14]
    - pytz [required: Any, installed: 2018.5]
django-picklefield==1.0.0
django-versatileimagefield==1.9
  - Pillow [required: >=2.4.0,<=5.0.0, installed: 5.0.0]
html2text==2018.1.9
icalendar==4.0.2
  - python-dateutil [required: Any, installed: 2.7.3]
    - six [required: >=1.5, installed: 1.11.0]
  - pytz [required: Any, installed: 2018.5]
jsonfield==2.0.2
  - Django [required: >=1.8.0, installed: 1.11.14]
    - pytz [required: Any, installed: 2018.5]
matplotlib==2.2.2
  - cycler [required: >=0.10, installed: 0.10.0]
    - six [required: Any, installed: 1.11.0]
  - kiwisolver [required: >=1.0.1, installed: 1.0.1]
    - setuptools [required: Any, installed: 39.2.0]
  - numpy [required: >=1.7.1, installed: 1.14.5]
  - pyparsing [required: >=2.0.1,!=2.1.6,!=2.1.2,!=2.0.4, installed: 2.2.0]
  - python-dateutil [required: >=2.1, installed: 2.7.3]
    - six [required: >=1.5, installed: 1.11.0]
  - pytz [required: Any, installed: 2018.5]
  - six [required: >=1.10, installed: 1.11.0]
mysqlclient==1.3.13
scipy==1.1.0
  - numpy [required: >=1.8.2, installed: 1.14.5]
tktitler==1.0.0
Unidecode==1.0.22
wiki==0.4a5
  - bleach [required: >=2.1,<2.2, installed: 2.1.3]
    - html5lib [required: >=0.99999999pre,!=1.0b8,!=1.0b7,!=1.0b6,!=1.0b5,!=1.0b4,!=1.0b3,!=1.0b2,!=1.0b1, installed: 1.0.1]
      - six [required: >=1.9, installed: 1.11.0]
      - webencodings [required: Any, installed: 0.5.1]
    - six [required: Any, installed: 1.11.0]
  - Django [required: >=1.11,<2.1, installed: 1.11.14]
    - pytz [required: Any, installed: 2018.5]
  - django-mptt [required: >=0.9,<0.10, installed: 0.9.0]
    - django-js-asset [required: Any, installed: 1.1.0]
  - django-nyt [required: >=1.1b1,<1.2, installed: 1.1b2]
    - django [required: >=1.11,<2.0, installed: 1.11.14]
      - pytz [required: Any, installed: 2018.5]
  - django-sekizai [required: >=0.10, installed: 0.10.0]
    - django-classy-tags [required: >=0.3.1, installed: 0.8.0]
      - Django [required: >1.3, installed: 1.11.14]
        - pytz [required: Any, installed: 2018.5]
  - Markdown [required: >=2.6,<2.7, installed: 2.6.11]
  - Pillow [required: Any, installed: 5.0.0]
  - sorl-thumbnail [required: >=12,<13, installed: 12.4.1]

Dvs. django-cleanup og django-model-utils er enten direct dependencies eller bliver slet ikke brugt.

Følgende ser ikke ud til at være direct dependencies (medmindre vi selvfølgelig bruger dem direkte):

Pillow (krævet af wiki og django-versatileimagefield)
sorl-thumbnail (krævet af wiki)
(numpy (krævet af scipy, men lad os beholde den som explicit dependency)) 

@tyilo
Copy link
Member Author

tyilo commented Jul 2, 2018

Udover Django skal være versioin 1.11.*, er der så nogen grund til at specificere end bestemt version for de andre pakker?

Jeg synes ikke en minimumsversion giver mening uden også et max og der er kun 2 pakker (django-multiupload og django-mediumeditor) som er pinned til en specifik version. Jeg foreslår derfor følgende Pipenv fil:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
Django = "==1.11.*"

django-jfu = {git = "https://github.com/CalPolyResDev/django-jfu"}
tktitler = {ref = "v1.0.0", git = "https://github.com/TK-IT/tktitler.git"}
wiki = {git = "https://github.com/django-wiki/django-wiki.git"}

django-constance = {version = "*", extras = ["database"]}

django-versatileimagefield = "*"
"django-bootstrap3" = "*"
icalendar = "*"
django-macros = "*"
mysqlclient = "*"
django-multiupload = "*"
django-mediumeditor = "*"
jsonfield = "*"
"html2text" = "*"
numpy = "*"
scipy = "*"
matplotlib = "*"
Unidecode = "*"

[dev-packages]

Hvilket resulterer i samme pakker som ovenfor, bortset fra at django-mediumeditor bliver opdateret fra version 0.2.0 til 1.0.0.

@tyilo
Copy link
Member Author

tyilo commented Jul 2, 2018

Se TK-IT/web#203

@neic
Copy link
Member

neic commented Jul 9, 2018

Følgende repo har (haft) requirements.txt:

@tyilo
Copy link
Member Author

tyilo commented Mar 29, 2020

Jeg er selv gået over til at bruge poetry nu.

@neic
Copy link
Member

neic commented Mar 31, 2020

Jeg bruger nu udelukket Docker med alle pakkerne installeret globalt. Vi er på arbejde lige begyndt at bruge pip-tools og en requirements.in. Den holder vi opdateret med Dependapot som laver PRs. Vores CI bygger et Docker image på hver push og tester det efterfølgende. Hvis der er god test coverage er det nemt at merge PRs fra Dependabot og være sikker på at alting stadig fungere.

EDIT: Og vigtigst: Den spytter bare en requirements.txt ud, så det er bagudkompatibelt med alting.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants