Управление зависимостями в Python в 2017

Игорь Шевченко, Antida software

Управление зависимостями в Python в 2017

Игорь Шевченко, Antida software

pip

pip

pip: установка пакетов

			pip install django
			pip install requests
		

pip: сохранение в файл

			pip freeze > requirements.txt
		

requirements.txt

			certifi==2017.7.27.1
chardet==3.0.4
Django==1.11.4
idna==2.6
pytz==2017.2
requests==2.18.4
urllib3==1.22
		

pip: установка из файла

			pip install -r requirements.txt
		

pip: удаление пакета

			pip uninstall requests
		

Проблемы

Проблема 1: обновление файла

Проблема 1: npm

			npm install jquery --save
		

Проблема 1: решение

			pip install celery
			pip freeze | grep celery >> requirements.txt
		

Проблема 2: глобальная установка пакетов

Проблема 2: решение

virtualenv

Проблема 3: фиксирование версий

Проблема 3: граф зависимостей

prof app app django django app->django requests requests app->requests pytz pytz django->pytz certifi certifi requests->certifi chardet chardet requests->chardet idna idna requests->idna urllib3 urllib3 requests->urllib3

Проблема 3: все зависимости

			certifi==2017.7.27.1
chardet==3.0.4
Django==1.11.4
idna==2.6
pytz==2017.2
requests==2.18.4
urllib3==1.22
		

Проблема 3: основные зависимости

			django==1.11
requests
		

Проблема 3: решение

Два файла: requirements.txt и requirements.lock.txt

Проблема 4: dev-зависимости

Проблема 4: npm

			npm install jquery --save
			npm install grunt --save-dev
		

Проблема 4: npm

			npm install
			npm install --production
		

Проблема 4: решение

Два файла: requirements.txt и dev-requirements.txt

Проблема 4: dev-requirements.txt

-r requirements.txt
pytest==3.2.3

Проблема 5: ад зависимостей

Проблема 5: конфликтующие зависимости

prof app app foo foo-client==1.2.1 app->foo bar bar-client==3.6.6 app->bar requests1 requests==2.3.1 foo->requests1 requests2 requests==2.5.2 bar->requests2

Проблема 5: решение

Всё сложно.

https://tech.knewton.com/blog/2015/09/the-nine-circles-of-python-dependency-hell/

Проблема 6: тайпосквоттинг

Проблема 6: пример

			pip install djanngo
		

Проблема 6: npm

Недавно был инцидент с пакетами, ворующими секретные токены

https://iamakulov.com/notes/npm-malicious-packages/

Проблема 6: решение

Хорошие ребята сами занимают похожие имена

https://www.pytosquatting.org/

2017

Pipfile

https://github.com/pypa/pipfile

Pipfile: формат файла

[[source]]
url = 'https://pypi.python.org/simple'
verify_ssl = true

[requires]
python_version = '3.6'

[packages]
requests = { extras = ['socks'] }
Django = '>1.10'

[dev-packages]
pytest = '*'
[[source]]
url = 'https://pypi.python.org/simple'
verify_ssl = true

[requires]
python_version = '3.6'

[packages]
requests = { extras = ['socks'] }
Django = '>1.10'

[dev-packages]
pytest = '*'

Pipfile: lock-файл

{
	"_meta": {
		"hash": {
			"sha256": "73d81f4fbe42d1da158c5d4435d9...",
		},
		"requires": [
			{"marker": "python_version", "specifier": "3.6"}
		],
		"sources": [
			{"url": "https://pypi.python.org/simple", "verify_ssl": true},
		]
		},
	"default": [
		{"name": "Django", "version": "1.10.3", "hash": "..."},
		{"name": "requests", "version": "2.12.1", "hash": "..."},
		{"name": "PySocks", "version": "1.5.6", "hash": "..."},
	],
	"development": [
		{"name": "pytest", "version": "3.2.3", "hash": "..."},
	]
}
{
	"_meta": {
		"hash": {
			"sha256": "73d81f4fbe42d1da158c5d4435d9...",
		},
		"requires": [
			{"marker": "python_version", "specifier": "3.6"}
		],
		"sources": [
			{"url": "https://pypi.python.org/simple", "verify_ssl": true},
		]
		},
	"default": [
		{"name": "Django", "version": "1.10.3", "hash": "..."},
		{"name": "requests", "version": "2.12.1", "hash": "..."},
		{"name": "PySocks", "version": "1.5.6", "hash": "..."},
	],
	"development": [
		{"name": "pytest", "version": "3.2.3", "hash": "..."},
	]
}

pipenv

pipenv

pipenv = pip + Pipfile + virtualenv

https://github.com/kennethreitz/pipenv

pipenv: установка

pip install pipenv

pipenv: старт проекта

			cd my_projectpipenv install
		

pipenv: добавление пакета

pipenv install djangopipenv install pytest --dev

pipenv: обновление лок-файла

pipenv lock

pipenv: удаление пакета

pipenv uninstall django

pipenv: восстановление среды

pipenv install

pipenv: исполнение команд

			pipenv shell
			pipenv run python my_project.py
		

Проблемы решены

pipenv: обнаружение конфликтов версий

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

[packages]
idna = "==2.7"
requests = "*"

pipenv: обнаружение конфликтов версий

			pipenv install
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
CRITICAL:pip.index:Could not find a version that satisfies the requirement
 idna==2.7 (from versions: 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 2.0
 2.1, 2.2, 2.3, 2.4, 2.5, 2.6)
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.
		

Проблемы решены

pipenv: защита от тайпосквоттинга

			pipenv install djanngo
Did you mean django? [Y/n]:
			
		

Проблемы решены

Дополнительные фичи

Безопасность: проверка хешей

Безопасность: оповещение об уязвимостях

Условная установка

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

[packages]
requests = "*"
pywinusb = {version = "*", os_name = "== 'windows'"}

Условная установка

[packages]
unittest2 = {version = ">=1.0,<3.0", markers="""\
	python_version < '2.7.9' or \
	(python_version >= '3.0' and python_version < '3.4') \
"""}

Открытие модулей

pipenv open requests
Opening 'C:\\Users\\igor\\.virtualenvs\\pipenv-I9XgK3SA
 \\lib\\site-packages\\requests' in your EDITOR.

Еще фичи

Переходите на pipenv!

Вопросы?

Слайды: https://igor-shevchenko.github.io/python-deps-2017
Почта: mail@igorshevchenko.ru
Твиттер: @igorshevchenko_

Спасибо автору картинок

Created by Gan Khoon Lay from the Noun Project