поэзия бег старт
Здесь, в Octopus Wealth, я работаю над рядом проектов, в которых есть интерфейс Typescript и бэкэнд Python. Чтобы переключиться с одного на другой, я должен помнить, как меняются инструменты, например, в кодовой базе Typescript я могу запускать yarn run test
(или npm run test
), тогда как в Python я выполнял pytest tests/
. К счастью, я считаю, что нашел для Python способ следовать Typescript, poetry run test
который объясняется в этой статье.
package.json скрипты / пряжа-скрипты
Файл package.json
, присутствующий в базах кода Javascript и Typescript, имеет необязательный раздел scripts
, который сопоставляет одно имя с пользовательской командой, которая крайне важна для запуска в установленной среде. Это означает, что я могу выполнить yarn run lint
и запустить eslint src/**/*.js src/**/*.jsx
(используя eslint
, установленный вместе с проектом). Обычно в моем package.json
файле есть следующие сопоставления:
"scripts": { "start": "node scripts/start.js", "format": "prettier --list-different \"src/**/*.{js,jsx}\"", "reformat": "prettier --write \"src/**/*.{js,jsx}\"", "lint": "eslint src/**/*.{ts,tsx}", "test": "jest --env=jsdom", },
Помимо сценариев
Сценарии предназначены для предоставления отдельных команд CI для проверки форматирования, линтинга и тестирования базы кода, а также для предоставления полезных помощников, предназначенных только для разработки, для запуска и переформатирования базы кода. Названия format
и reformat
можно улучшить.
скрипты pyproject.toml / поэтические скрипты
Поэзия - это инструмент Python для упаковки и управления зависимостями. Как и yarn, он управляет зависимостями концептуально и через файл блокировки с эквивалентом package.json
, называемым pyproject.toml
, и эквивалентом yarn.lock
, называемым poetry.lock
. Одно это означает, что я могу просто запустить yarn install
или poetry install
, чтобы установить и настроить зависимости для любой базы кода.
Поэзия также понимает раздел скриптов в pyproject.toml
файле, хотя, к сожалению, поэзия пока не позволяет указывать команду, скорее скрипт должен отображаться в модуль Python и функционировать в формате module:function
. Чтобы обойти это, я добавил это в файл pyproject.toml
,
[tool.poetry.scripts] format = "scripts:format" reformat = "scripts:reformat" lint = "scripts:lint" start = "scripts:start" test = "scripts:test"
затем я создал файл с именем scripts.py
в корневом каталоге кодовой базы со следующим кодом:
# This is a temporary workaround till Poetry supports scripts, see # https://github.com/sdispater/poetry/issues/241. from subprocess import check_call def format() -> None: check_call( ["black", "--check", "--diff", "src/", "tests/"], ) def reformat() -> None: check_call(["black", "src/", "tests/"]) def lint() -> None: check_call(["flake8", "src/", "tests/"]) check_call(["mypy", "src/backend/", "tests/"]) def start() -> None: check_call(["python", "src/backend/run.py"]) def test() -> None: check_call(["pytest", "tests/"])
Ключевым моментом является то, что check_call
вызовет исключение, если вызов вернет ненулевой код, что, в свою очередь, гарантирует, что вызов поэзии вернет ненулевой код. Это означает, что стандартные сценарии CI могут понимать успехи и неудачи.
Заключение
При такой настройке мне и моим коллегам нужно только помнить, что любой инструмент, который я использую в кодовой базе Javascript / Typescript как yarn run abc
, доступен в кодовой базе Python как poetry run abc
. Подробно это указано в таблице ниже,
Aim | Javascript | Python -------------------------------------------------------------------- Install dependencies | yarn install | poetry install Lint the code | yarn run lint | poetry run lint Test the code | yarn run test | poetry run test Check formatting | yarn run format | poetry run format Format the code | yarn run reformat | poetry run reformat
С благодарностью за это предложение, которое вдохновило на это.