У вас есть идея и вы хотите превратить ее в немного кода, чтобы выполнить его. Что вы делаете? Вы открываете свой IDE/Editor, возможно, вы структурируете его внутри папки с некоторым инструментом по умолчанию для снятия и (при необходимости), и вы получаете код для работы. Это хакерское, это уродливое, но это работает.
Теперь, когда у вас есть что -то, вы хотите добавить еще одну функцию или выработать ошибку. Что вы делаете? Вы следите за тем же процессом. Если вы чувствуете себя пикантно, возможно, вы инициируете новый репозиторий GIT в основе проекта, но нет никакого реального смысла в ветвлении и слиянии обратно в Мастера. Резервное копирование кода? Может быть учетная запись на Bitbucket, или, может быть, что -то с Gitlab. У них обоих есть свободные уровни использования с частными репозиториями, и это определенно недостаточно для общественности.
Это продолжается с большими функциями, взломанными, без тестов и нулевой документации (кроме комментария здесь и там), все это оставалось на 100% частным. Может быть, вы пытаетесь заставить его работать на цифровом океанском сервере, который вы выступили как плавающее рабочее пространство с постоянным подключением к Интернету. Это было сложно, но сейчас это работает. Как бы. Ну, в любом случае, в любом случае.
Ваш портфолио кода все еще не хватает. Не так много, потому что не так много в достаточно хороших условиях, чтобы показать кому -либо. У вас есть много таких крошечных проектов, которые пронизаны тем, что, как вы знаете, являются плохими практиками, но были намного проще, чтобы выяснить правильный способ сделать это. Вы относитесь к своим вкладам с открытым исходным кодом почти как на сцену, где у вас все прекрасно продумано. Сначала вы должны написать документацию, что означает, что вы должны четко определить тот сервер Snowflake, который у вас есть для запуска вашего скрипта. Это также означает, что вы должны написать документацию по использованию. Автоматизированные тесты также с различной важности в зависимости от сообщества, окружающего язык, на котором реализован ваш проект.
Это был мой процесс в течение многих лет с любым количеством некогда сценариев. Проекты, которые были предназначены для повторяющейся, низокрученной цели, которую я имел бы в частном порядке, и, когда мне больше не нужно было в них, или они сломались из -за изменений в других местах (например, разбившись веб -скребки, потому что обновления веб -сайтов) я бы просто удалил бы Проект и назовите это сделанным. Конечно, я бы мог только устно упомянуть ” Да, я построил что -то подобное в свободное время »во время собеседований, но не смог бы доказать это, потому что это было дольше, чем неделю назад И я не спас работу.
В последнее время я обнаружил, что есть способ облегчить эти растущие боли.
В каждом (законном) языке в наши дни есть стратегия управления пакетами. Не знакомы с концепцией управления пакетами? Поговорим об этом на секунду.
У вас есть новый проект, скажем, он сейчас написан на Python. Стандартный формат пакета хорошо определен для установки с использованием пип
. Он включает в себя зависимости, название пакета, имя автора и контактную информацию, ограничения версий для зависимостей … много информации, которая должна быть-должна быть-стандартизирована. В Python это последовательно определяется в setup.py
у основания репозитория.
Рассмотрим следующую структуру хранилища:
├── LICENSE.md ├── README.md ├── setup.py └── my_project ├── __init__.py ├── core │ ├── admin_commands.py │ ├── inbox.py │ ├── initialize.py │ ├── mentions.py │ ├── posts.py │ ├── user_interaction.py │ └── validation.py ├── helpers │ ├── misc.py │ └── wiki.py ├── main.py └── strings ├── debug.py ├── posts.py ├── responses.py └── urls.py
У нас есть проект по имени my_project
, что должно быть названием пакета в setup.py
Анкет Python имеет конвенцию Java-esque Импорт пакет.name.here
На карту в Пакет/Имя/ЗДЕСЬ.PY
Структура файловой системы.
У пакетов всегда есть Readme. Если вы используете генератор пакетов (например, Bundle Gem
), и он генерирует readme, Всегда Удалите сгенерированное описание по умолчанию (и другие линии TODO) и вставьте свое собственное. Не уверен, о чем ваш проект? Обратите внимание, что он в настоящее время покрывает. Вы можете обновить его позже. Это точка управления версией.
В ReadMe включайте инструкции по установке, которые реалистичны для вашей ситуации. Существуют ли нативные зависимости от ОС, которые вам нужны тоже установлены? Они могут не хорошо вписаться в setup.py
или *.gemspec
файлы В этом случае поместите это в ReadMe.
Часто в паттерке включает в себя много шума, который может не понадобиться для публичной публикации пакета. Вот минимальные требования для любого пакета, который я делаю, публично или частный. Я забывчивый человек, поэтому возвращение к проекту через 2 месяца потребуется все равно снова встать на скорость. Мне нравится облегчить себе этот список требований для Readme:
- Применение
- Процедура установки (предположим, что недавно установленная ОС)
- Описание
- (Если применимо) предположения о зависимостях собственной платформы
Пакеты дают очень четкое определение того, что нужно для запуска программного обеспечения, которое было написано. В течение многих лет я слышал, что успешные проекты включают в себя очень узко определенную масштаб и что лучший способ сделать это – это узко определенные интерфейсы.
В программировании вы можете увидеть, как младший разработчик взломал магический метод, который принимает входные данные в любых разнообразных формах и может нормализовать его. Если это не является основной функцией метода/команды/атомного блока, которую они создают, более опытные разработчики осознают этот очень легко снеток в кошмаре обслуживания. То же самое можно сказать и о отслеживании зависимостей. Наличие четко определенного набора необходимых зависимостей (вместо того, чтобы конечный пользователь выполнял пробную версию и ошибку, чтобы установить все) всегда будет лучше.
Например, Python включает в себя некоторую загрузку для настройки пакета. Для меня это включало в себя поиск предыдущих проектов ‘ setup.py
файл, изменение его в соответствии с новым проектом и создание некоторых структур по умолчанию, таких как my_project/__ init__.py
содержащие переменные для версии ( __version__
) и автор ( __author__
). Это также включает в себя настройку автоматического тестирования с помощью сценариев Unittest и Shell для облегчения проведения автоматического тестирования.
Вот моя эвристика, когда дело доходит до создания упаковки:
- Есть любой Зависимости, которые требуют менеджера пакетов (например,
PIP
,npm
,драгоценный камень
)? - Нужно ли разделить исходный код на несколько файлов?
- Я тестирую свою работу с большей гранулярностью, чем полными, сквозными тестами?
- Нужно ли мне легко развернуть это, например, инструмент командной строки?
- Нужно ли мне вернуть релизы и иметь стабильные, бета -версию и DEV копий исходного кода?
- Я отслеживаю изменения кода с GIT?
Если я ответил да на любой один Из этих вопросов я знаю, чтобы создать проект в пакет.
Это означает, что я …
- Создайте новый репозиторий GIT (и частный отдаленный, для целей резервного копирования)
- Создайте readme (в Markdown, предпочтительно)
- Отслеживание зависимостей, которые я устанавливаю или удаляю, когда я устанавливаю или удаляю их
- Сформулируйте стратегию тестирования, чтобы убедиться, что все работает, как и ожидалось (автоматизировано или ручное)
- Создайте набор удобных сценариев для выполнения повторяемых задач, оцениваемых только для текущего проекта (например, Makefile, Rakefile, Bundler Binstubs, Shell Script)
Оригинал: “https://dev.to/thelonelyghost/on-the-importance-of-packaging”