Перетворення особистого проекту Python у звільнену бібліотеку


28

Я не академік, а не програміст, і маю багаторічний досвід написання програм Python для власного використання, щоб підтримати моє дослідження. Мій останній проект, ймовірно, буде корисний багатьом іншим, як і мені, і я думаю випустити його як бібліотеку Python з відкритим кодом.

Однак, мабуть, є певні перешкоди для переходу від функціонуючого особистого проекту до бібліотеки, який можна безболісно встановити та використати іншими. Це питання стосується перших кроків, які я повинен зробити, щоб почати працювати над публічним випуском.

Наразі у мене є єдине сховище git, яке містить мій код, який використовує бібліотеку, а також саму бібліотеку, і я використовую git як кнопку екстреного скасування у випадку, якщо щось порушиться. Все це добре працює для одного користувача, але, очевидно, не підходить, якщо я хочу його випустити. Я хочу закінчити те, що моя бібліотека знаходиться в окремому сховищі та може бути встановлена ​​іншими користувачами pipта має стабільний API.

Навчитися використовувати setuptools і т. Д., Мабуть, не так складно, як тільки я хочу, щоб опублікувати його - моя проблема полягає в тому, щоб знати, як я повинен працювати, щоб дійти до цієї точки.

Отже, моє запитання: які перші кроки потрібно зробити, щоб розпочати підготовку проекту бібліотеки Python для громадського споживання? Як слід реорганізувати структуру свого каталогу, сховища git тощо, щоб почати працювати над публічним випуском бібліотеки?

Загалом, було б дуже корисно, якщо є ресурси, які, як відомо, є корисними при спробі цього вперше. Вказівки на кращі практики та помилки, яких слід уникати тощо, також були б дуже корисними.

Деякі роз’яснення: поточні відповіді стосуються питання у відповідь на тему «як я можу зробити свою бібліотеку Python гарною для використання іншими?». Це корисно, але воно відрізняється від питання, яке я мав намір задати.

Зараз я на початку тривалої дороги до виходу свого проекту. Ядро моєї реалізації працює (і працює дуже добре), але я відчуваю себе перевантаженим обсягом роботи, що переді мною, і я шукаю вказівки щодо того, як орієнтуватися в процесі. Наприклад:

  • Наразі мій бібліотечний код поєднаний з моїм власним кодом, що його використовує. Він живе в підпапках і ділиться тим самим сховищем git. Врешті-решт, його потрібно буде перетворити на окрему бібліотеку та помістити у власне сховище, але я продовжую зволікати з цим, бо не знаю, як це зробити. (Ні про те, як встановити бібліотеку в «режимі розробки», щоб я все-таки могла її редагувати, ні про те, як тримати репост git у синхронізації.)

  • Мої доктрини стислі, тому що я знаю, що з часом мені доведеться використовувати Сфінкс або якийсь інший інструмент. Але ці інструменти здаються не простими для вивчення, тому це стає головним підпроектом, і я продовжую його відкладати.

  • У якийсь момент мені потрібно навчитися використовувати setuptools або якийсь інший інструмент, щоб упакувати його і відстежувати залежності, які є досить складними. Я не впевнений, потрібно мені це робити зараз чи ні, а документація - це абсолютний лабіринт для нового користувача, тому я продовжую вирішувати це робити пізніше.

  • Мені ніколи не доводилося робити систематичне тестування, але я безумовно буду для цього проекту, тому я повинен (i) вивчити достатньо тестування, щоб знати, яка методологія підходить для мого проекту; (ii) дізнатися, які інструменти доступні для моєї обраної методології; (iii) навчитися користуватися обраним інструментом; (iv) впроваджувати тестові набори тощо для мого проекту. Це сам по собі проект.

  • Можливо, є й інші речі, які я повинен також зробити. Наприклад, jonrsharpe розмістив корисну посилання, в якій згадується git-flow, токсин, TravisCI, virtualenv та CookieCutter, про жодне з яких я не чув раніше. (Допис від 2013 року, тому мені також доведеться виконати певну роботу, щоб дізнатися, скільки ще існує.)

Коли ви все це з’єднаєте, це величезна робота, але я впевнений, що зможу це зробити, якщо продовжую підключатися до цього, і не поспішаю. Моя проблема полягає в тому, щоб знати, як розбити її на керовані кроки, які можна зробити по черзі.

In other words, I'm asking which are the most important concrete steps I can take now, in order to reach a releasable product eventually. If I have a free weekend, which of these things should I focus on? Which (if any) can be done in isolation from the others, so that I can at least get one step done without needing to do the whole thing? What's the most efficient way to learn these things so that I will still have time to focus on the project itself? (Bearing in mind that all of this is essentially a hobby project, not my job.) Is there any of it that I don't actually need to do, thus saving myself a huge amount of time and effort?

Усі відповіді високо оцінені, але я особливо вітаю відповіді, які зосереджуються на цих аспектах управління проектами, конкретно посилаючись на сучасну розробку Python.



10
Найкращий спосіб перевірити, чи готова бібліотека до виходу "в дику природу" - попросити колегу-дослідника чи студента спробувати її використати та записати всі труднощі, з якими вони стикаються. Якщо вони можуть використовувати його, не вимагаючи постійно звертатися за допомогою, то бібліотека має форму, яку можуть використовувати інші.
Барт ван Інген Шенау

@jonrsharpe дякую, там є багато супер корисної інформації
Натаніел

@BartvanIngenSchenau дякую, я обов'язково маю це на увазі, як тільки я наближуюся до цього кроку. Зараз я дуже перебуваю на етапі "перших кроків", коли я роблю щось, що працює, але дуже далеко не готове до випуску, і мені цікаво, як мені зараз робити справи, щоб переконатися, що це може стати звільненим у майбутньому.
Натаніел

3
Ви обов'язково повинні зробити самостійну gpo repo для бібліотеки, а потім бути своїм власним першим клієнтом. Використовуйте бібліотеку у своєму проекті лише як належну бібліотеку, не посилаючись на її джерело.
Іван Макдональд

Відповіді:


22

Додавання setup.py, хоча це необхідно, не є найважливішим кроком, якщо ви хочете використовувати вашу бібліотеку. Важливіше - додати документацію та рекламувати свою бібліотеку. Оскільки другий момент сильно залежить від бібліотеки, дозвольте зосередитись на аспекті документації.

  1. Ви знаєте все про вашу бібліотеку. І це проблематично. Ви вже знаєте, як встановити та як ним користуватися, тому багато речей можуть здатися вам інтуїтивно зрозумілими чи зрозумілими. На жаль, ті ж речі можуть бути ні очевидними, ні інтуїтивно зрозумілими для користувачів. Постарайтеся подивитися на свою бібліотеку так, ніби ви нічого не знаєте про неї, і що ще важливіше, попросіть інших людей використати її та спробуйте визначити всі труднощі, які вони мали.

  2. Поясніть простою англійською мовою про вашу бібліотеку. Занадто багато бібліотек припускають, що про них знають усі. Коли це не так, може бути важко зрозуміти, яка мета бібліотеки.

  3. Напишіть детальну технічну документацію, але також не забувайте про короткі фрагменти коду, які показують, як виконувати деякі завдання зі своєю бібліотекою. Більшість розробників поспішають, і якщо їм потрібно витратити години, намагаючись зрозуміти, як зробити основну річ, вони можуть схильні переходити на інші бібліотеки.

  4. Включіть свою контактну інформацію. Якщо ваша бібліотека має успіх (а мій власний досвід показав, що це стосується навіть і досить невідомих), люди зіткнуться з нею з проблемами: або помилками, або просто труднощами з розумінням або використанням деяких його частин. Часто корисно отримувати їх відгуки, щоб покращити вашу бібліотеку: для кожної людини, яка повідомила про проблему, можливо, сотні, які, зіткнувшись з нею, просто вважають за краще перейти до іншої бібліотеки.

Додатково до цього:

  1. Дайте зрозуміти, чи ваша бібліотека працює з Python 2 або 3 або обома.

  2. Якщо бібліотека не працює в Windows, скажіть так.

  3. Переконайтеся, що ви використовуєте офіційні конвенції (використовуйте pep8 для перевірки). Якщо ні, то поясніть це чітко або зафіксуйте.

  4. Подбайте про обробку крайових шаф. Коли ваша бібліотека викликається неправильним типом або зі значенням, яке не підтримується, простою англійською мовою слід сказати, що саме не так. Що не слід робити, це підняти загадливий виняток на десять рівнів вниз стеком і дати користувачеві зрозуміти, що пішло не так.


Дякую, я повністю згоден, що якість документації робить або порушує проект. (Зазвичай це друге, що я перевіряю, приймаючи рішення про те, чи використовувати проект після дати останнього виконання комісії.) На більш технічному рівні існує заплутано велика екосистема інструментів для управління документацією коду Python. Як я можу сказати, який я повинен інвестувати у навчання для свого проекту?
Натаніел

3
@Nathaniel Sphinx трохи складний у створенні, але це фактично стандарт. Ви можете використовувати readthedocs.org для розміщення документації про Сфінкс в Інтернеті. Сфінкс може використовувати доктрини з функцій та модулів у вашій бібліотеці. Крім того, просто введіть документи у файл readme, але це стає непростим для великих проектів. Проект Python, який я підтримую, використовує сторінки Github для документації щодо Сфінкса, що означає, що я маю вводити HTML-файли, хоча я планую відходити від цього.
амон

5
How can I tell which one I should invest in learning for my project?- ти цього не робиш. Ви витрачаєте трохи часу, вибираючи той, який здається розумним, і катаєтеся з ним. Як розробник javascript, де у вас є 40 варіантів для кожного рішення, я обіцяю це правильне рішення :)
aaaaaa

2

Використовуючи протягом декількох років бібліотеки з меншою мірою, ніж зрілі, ключовий рада, коли ви вибрали інструмент розгортання, зробіть наступне: чи робить ваша бібліотека щось дійсно корисне, що ви можете створити спільноту навколо?

Визначте залежність вашої бібліотеки.

Спробуйте розгорнути в чисте середовище або контейнер для пакетів або VM. Я вважаю цей крок вирішальним, тому що часто в особистому середовищі є щось унікальне, що викликає проблеми.

Подумайте, хто збирається підтримувати бібліотеку в майбутньому, немає нічого страшнішого, ніж натрапити на бібліотеку, яка була чиєюсь домашньою твариною протягом трьох-чотирьох років, а потім не отримувати оновлення, необхідні для того, щоб підтримувати її актуальною.

Подумайте, чи хочете ви або ваша команда взяти на себе зобов’язання тримати тестування та документування бібліотеки (одиничні тести та CI трубопроводи починають бути частиною рівняння).


2

Можливо, ви могли б знайти зрілий проект OSS у своїй галузі та внести свій код у цей проект? Переваг може бути декілька, таких як:

  • Ви можете максимально збільшити свій внесок. Дійсно, багато проектів ОСБ є потенційно цінними, але мало використовуються громадою (див. Відповідь @ReaddyEddy). Це просто багато зусиль, щоб змусити проект спочатку подряпати, а потім підтримувати його, рекламувати, надавати належні приклади та документацію тощо.
  • Багато технічних питань, про які ви згадали, уже будуть вирішені в зрілому проекті.
  • Якщо ваша бібліотека додає значення проекту OSS, її учасники можуть допомогти вам довести код до стандартів проекту. Так ви зможете заощадити зусилля та набути досвіду. Ви також отримаєте конкретні відповіді про Sphinx, TravisCI, CookieCutter та інші технічні аспекти.

Якщо є відповідний проект OSS, який вам подобається і, можливо, ви використовуєте, чому б не відкрити проблему чи запит на виклик або іншим чином зв’язатися з обслуговуючими особами? (Хорошим способом почати може бути вирішення існуючої проблеми.)


Дякую, це приємна ідея. Однак у моєму випадку не існує існуючого пакету, в який міг би бути інтегрований мій код. Існує створений проект OSS з подібною функціональністю, але він побудований за різною технологією і в своїй основі використовує принципово інший алгоритм. (Як результат, деякі речі принципово неможливі, які стають простими в моїй версії.) Я впевнений, що для мого коду є невелика, але потенційно віддана аудиторія, але, оскільки це новий підхід, я не думаю, що існує жодного способу зробити це доступний за винятком розробки як нового проекту.
Натаніел

2

Це 2019 рік, я настійно пропоную почати з найсучасніших інструментів. Вам не потрібно, це setup.pyте, чого люди в спільноті Python хочуть позбутися, і я вірю, що зрештою вони і стануть.

Спробуйте поезію , ви не пошкодуєте.


1
Дякую за відповідь. Я погляну на поезію. Хочеться сказати, проте, що в 2019 році новачку фантастично складно розробити, які насправді є найсучасніші інструменти. Якщо ви не знаєте, дуже важко сказати, які інструменти є фактично стандартними, якими користуються всі, а які - серед безлічі також раундів та експериментальних проектів. Офіційна документація не йде в ногу з цими речами, і розробка рухається так швидко, що будь-який вступний матеріал, який я знайду, гарантовано застарів.
Натаніел

Все, що потрібно сказати дякую за те, що ви сказали мені, що я повинен шукати поезію, а не три чи чотири інші активні проекти, які, як я вважаю, роблять те саме. Це та інформація, яку я сподівався отримати з цього питання.
Натаніел

@Nathaniel Python "Упаковка" змінюється швидко (і тому існує багато способів зробити це, і важко знайти те, що найкраще), але з PEP 517, 518, реалізованим багатьма інструментами (як Поезія), ми нарешті маємо щось таке не так страшно. Зауважте, що поезія - це не обов'язково "найкращий" інструмент, але принаймні це один із найкращих. Погляньте на testandcode.com/52 , ви отримаєте досить гарне уявлення про цю тему.
laike9m

Дякую, це дуже корисно, я зараз слухаю. Можливо, все це означає, що я зараз повинен відмовитись від упаковки і зосередитись на інших аспектах (наприклад, інструментах для вивчення документації та тестування), просто тому, що може існувати більш стабільна екосистема упаковки Python через півроку.
Натаніел

2

Це складне питання, яке ви задаєте, і я повністю згоден з відповіддю Арсені . Гарна документація є дуже важливим аспектом. Якщо мені не вдасться запустити вашу бібліотеку та запустити її за допомогою декількох простих кроків, я просто відкидаю її туди (якщо тільки мені не дуже хочеться її спробувати).

Деякі речі, які ви обов'язково враховуєте

  • Подумайте, як ви збираєтеся виконати версію своєї бібліотеки. Ви хочете мати зворотну сумісність до певного рівня, а також виправлення по маршруту. Читайте про семантичну версію
  • Ви використовуєте git порівняно лінійним способом (для скасування). Чи знайомі ви з розгалуженням в git . Це насправді не так складно і робить життя легким. Як тільки ви зчепитесь з гілками. Адаптуйте модель розгалуження для вашого сховища. Виберіть частини цієї моделі розгалуження, які вважаєте за потрібні . Порівняйте це також із гілками сховищ, які ви використовуєте.
  • Ліцензування: ви повинні надати ліцензію на свою бібліотеку. Я не є юридичним експертом з цього питання, тому можу поділитися лише посиланням на це порівняння між загальними ліцензіями . Не сприймайте цей вибір легковажно.
  • Багтейкер. Ви хочете, щоб користувач міг надати вам звіти про помилки. Це допомагає покращити якість коду. Для кожної помилки, яку ви вирішите, додайте тест до роботи в тестовій рамці, що гарантує, що вона не гальмує в майбутньому (тест регресії). Система відстеження помилок може використовуватися для запитів функцій.
  • Внески користувачів. Ви хочете внести користувачі? Я не впевнений, як це зазвичай працює на продуктах з відкритим кодом, але я можу уявити, що ви можете дозволити користувачам створювати гілки функцій. Через github ви, здається, зможете контролювати це за допомогою запитів на виклик

Я не маю відповідного досвіду роботи з Python, тому не можу дати вам жодних підказок у цьому напрямку. Однак, можливо, автоматизувати всі тестування, що ініціюються кожним комітом у вашому віддаленому сховищі (тобто, використовуючи Jenkins ). Однак я пропоную відкласти це, оскільки для цього потрібно багато роботи без попереднього досвіду.


2

Це чудові питання.

Про важливі конкретні додаткові кроки до випуску бібліотеки:

  • Відокремте файли, які стануть бібліотекою від решти проекту.
    • Бібліотека повинна перейти до власного сховища git, але вам може бути корисним проміжним кроком для розміщення її в окремому каталозі верхнього рівня у вашому поточному сховищі. Коли ви робите це окремим сховищем, зберігайте його поруч із рештою проекту, яке потім може посилатися на нього, ../libraryпоки ви не обійдетесь із кроком упаковки та режиму розробки.
    • Усі звернення від решти проекту до цієї бібліотеки повинні проходити через її публічний API. Можливо, ви знайдете деякі взаємозалежності, щоб роздиратись.
  • Поступово пишіть документи, щоб документувати API бібліотеки.
    • Врешті-решт документи будуть перетворені в інструмент документації, але важливою роботою є написання тексту, що пояснює API стисло та достатньо, для інших людей. Це простіше заповнити його за раз, ніж все одночасно, і це вийде набагато краще, написавши грубі чернетки та повернувшись до нього пізніше, коли прийде на думку кращі пояснення та приклади.
    • Якщо ви знайдете частину API важко документувати, запитайте, чи є в цій частині API можливість вдосконалення. Чи може бути простіше? Більш регулярні? Це занадто загально? Занадто спеціалізований? Чи може він використовувати більш знайомі імена?
    • Документи можуть документувати типи аргументів, використовуючи структуровані коментарі, які інструменти можуть перевіряти. Я ще не повинен знайти справжню документацію з цього приводу, але PyCharm IDE допоможе побудувати ці документи і негайно перевірить типи аргументів під час редагування викликів методів.
    • Якщо говорити про це, PyCharm - чудовий інструмент для економії часу розробника та покращення якості коду. Він буде запускати "перевірки" для перевірки коду під час редагування, наприклад, перевірка типів, коли він може, перевірка відсутності та невикористаного імпорту, дублювання методів, помилки стилю PEP 8 тощо.
  • Почніть писати одиничні тести, використовуючи pytest. Задовго до того, як випустити реліз, одиничні тести окупляться у вашій власній розробці, знаходячи помилки у кутових випадках та забезпечуючи впевненість, що зміни коду не порушили справи. Знову ж таки, ви можете це наростити з часом. Почати досить просто.
  • Перегляньте наявні бібліотеки з відкритим кодом (приблизно однакового розміру) на GitHub, щоб побачити, як вони упорядковують файли та релізи. Подивіться, як вони роблять відстеження помилок / проблем і тягнуть запити. Зробіть свій внесок в один або декілька з них, щоб отримати досвід роботи з цими процесами організації проектів для багатьох людей, якщо ви не маєте там досвіду. GitHub має хороші інструменти для цих процесів. Це добре робить з README.mdфайлами документації на верхньому рівні та в будь-якому каталозі та з файлом ліцензії.
  • Для отримання зворотного зв’язку щодо бібліотеки, її API та документації рекомендуйте залучати до колабораторія.
    • Коли ви випустите, вам допоможе один або кілька співпрацівників виправити помилки під час відпустки, допомогти відповісти на запитання користувачів, а тим часом почати робити "Запити на запити" з оглядами коду, щоб розібрати завдання випуску бібліотеки, і привнести додатковий досвід управління проектами та дизайн бібліотеки.
  • Поки ви займаєтеся лінійною історією фіксації git. Врешті-решт, корисно буде використовувати "видавати гілки" для конкретних виправлень та змін, "випускати гілки" для керованого запуску до випуску та "гілки розробки" для будь-якої роботи, яка працює у багатьох людей, яка не готова до злиття. в головну галузь. Тому відкладіть день чи два на цьому шляху, щоб дізнатися про це, і почніть практикуватися з цим, перш ніж вам потрібно покластися на ці навички git. git дуже гнучкий і корисний, але користувальницький інтерфейс може бути загрозливим .
    • Одне місце для читання гілок git та їх використання - у книзі Pro Git . З багатьох способів використання гілок, почніть з просто "видачі гілок".
    • Додаток GitHub Desktop - прекрасний інструмент для управління гілками. Він також чудово підходить для внесення комісій, оскільки дозволяє легко писати повідомлення про фіксацію, переглядаючи всі зміни.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.