Как организовать структуру проектов Arduino для удобства управления версиями?
Я уже давно ищу хороший ответ на этот вопрос.
Как правило, любой проект Arduino, кроме самого простого, будет включать в себя:
- Основной файл исходного кода
MyProject.ino
- Библиотеки, относящиеся к проекту (
MyProjectLibrary1.h
,MyProjectLibrary1.cpp
...) - Библиотеки сторонних производителей (как правило, с бесплатным открытым исходным кодом, добавленные вручную в каталог библиотек Arduino)
- Схемы, схемы печатных плат
- Документация
- ...
Все это затрудняет управление исходным кодом всего кода и документа одного проекта (например, в Subversion, Git или GitHub).
Управление системой управления версиями вашего проекта означает управление версиями всех файлов, используемых проектом, включая сторонние библиотеки.
Теперь для одного проекта мне нужно определить структуру каталогов, которая:
- Включает все файлы проекта, как описано выше
- Я могу полностью довериться инструменту управления исходным кодом (включая зависимости от сторонних производителей)
- Я могу проверить в любом месте на своем жестком диске и построить проект оттуда (должно ли это быть одно местоположение, как предписано средой IDE Arduino)
- Я могу архивироваться в автономный архив, который я могу отправить другу, чтобы он построил его как можно проще (без дополнительной ручной загрузки)
Что я нахожу особенно сложным в проектах Arduino, так это управление зависимостями внешних библиотек. Разработчики Java - проектов имеют для этого репозитории maven, и это очень помогает в управлении всеми внешними хранилищами данных. Но у нас нет эквивалентной системы для библиотек Arduino.
Мне было бы интересно узнать, как другие разработчики проектов Arduino решают эти аспекты в своих собственных проектах.
Также обратите внимание, что я открыт для изменения процесса разработки, включая мою IDE (в настоящее время я большую часть времени использую Eclipse с плагином Arduino, а затем гарантирую, что мои проекты также могут работать напрямую с Arduino IDE).
@jfpoilpret, 👍92
Обсуждение7 ответов
Лучший ответ:
Вот путь, которым я, наконец, решил следовать для своих проектов.
Arduino-CMake
Первым важным решением, которое я принял, был выбор инструмента сборки, который мог бы работать в моей среде (Windows), но не ограничивался им (я хочу, чтобы мои проекты легко использовались другими людьми).
Я протестировал различные инструменты для создания Arduino с открытым исходным кодом:
- Guyzmo файл Makefile (по предложению @ЗМО ответ): это стандартный файл Makefile вручную для Arduino строит; это является Unix Makefile, но есть хороший порт в Unix и сделать для окон; до сих пор, к сожалению, этот make-файл работает только для Unix, конечно, это можно было бы адаптировать под Windows, но я хотел инструмент, который работает "из коробки".
- Файл Arduino-Makefile (предложен ответом @adnues): это более продвинутый проект, основанный на файле создания Unix, который предназначен для простого повторного использования всеми проектами Arduino; он задокументирован как работающий на Mac, Linux и Windows, но поддержка Windows оказалась неверной в моих первых экспериментах (многие зависимости от оболочки Unix).
- Graduino (не предполагают ответа): это инструмент построения базируется на известных Gradle в построить инструмент от заводной мире; инструмент, кажется, довольно хорошо сделано, но требуется некоторое (небольшое) в Groovy/Gradle в знания, а есть только маленькая документации; я решила не ехать с ним из-за проблем установки в Groovy и Gradle только для него (я бы хотел избежать слишком много условий, чтобы люди, которые хотят создавать свои проекты на своих условиях).
- Arduino-CMake (не предлагается ни одним ответом): это кажется лучшим из всех, у него долгая история, много сторонников и сопровождающих, он очень хорошо документирован, снабжен простыми примерами, а также имеет несколько хороших обучающих сообщений в блоге в Интернете, например, здесь и там. Он основан на CMake, "Кросс-платформенной марке".
Я также нашел ArduinoDevel, еще один инструмент для сборки Arduino, с которым я не экспериментировал, который может генерировать файлы создания Unix или ant build.xml
файлы; этот показался интересным, но немного ограниченным с точки зрения функциональности.
Наконец я решил пойти с Arduino-CMake:
- это было легко настроить: просто установите CMake на компьютер и скопируйте Arduino-CMake в какой-нибудь каталог, который легко доступен (по относительным путям) из каталогов ваших проектов.
- примеры работали для меня из коробки (просто следуйте комментариям в
CMakeLists.txt
файл конфигурации для адаптации свойств, необходимых для моей среды, например, тип Arduino, последовательный порт) - вы можете организовать свои проекты так, как вам захочется
- он может генерировать файлы конфигурации для различных инструментов сборки (хотя я тестировал только файлы создания Unix), включая проекты Eclipse.
в сгенерированной марке создается несколько целевых объектов для поддержки:
- библиотеки строят
- программы строят
- загрузка программы на платы
- запуск последовательного монитора
- и еще несколько других, которые я еще не тестировал
Структура проекта
Поскольку Arduono-CMake не навязывает никакой структуры каталогов для вашего проекта, вы можете выбрать ту, которая подходит вам лучше всего.
Вот что я сделал лично (это все еще требует дальнейшей доработки, но сейчас я доволен этим):
Я решил поместить все свои проекты в общий каталог arduino-материалов
(который я передаю на github в целом, я знаю, что мог бы использовать подмодули git для лучшей организации на github, но у меня еще не было времени это проверить).
arduino-материал
имеет следующее содержание:
сборка
: это каталог, в котором cmake и make будут генерировать все свои материалы (файлы makefile, кэш, объектные файлы...); этот не привязывается к githubcmake
: это просто копия (неизмененная) каталога Arduino-CMake cmake. Этот файл попадает на github, чтобы было проще для тех, кто хочет создавать мои проектыCMakeLists.txt
: это "глобальная" конфигурация CMake, которая объявляет все значения по умолчанию для моей среды (плата, последовательный порт) и список целевых подкаталогов сборкиTaskManager
: это мой первый проект, основанный на Arduino-CMake, это библиотека с примерами; этот idrectory также содержитCMakeLists.txt в нем
указаны цели проекта
Моменты для улучшения
Однако нынешнее решение не является идеальным. Среди улучшений, которые я вижу (это скорее для проекта Arduino-CMake, чтобы включить эти улучшения, если они сочтут нужным):
- Функция копирования каталога библиотек из текущего проекта в каталог библиотек Arduino
- Функция загрузки библиотеки на github
- Функция загрузки библиотеки с github
Вы уже пробовали PlatformIO? Возможно, его не было рядом, когда вы задавали этот вопрос.. http://platformio.org/, @ohhorob
Похоже, что проект умирал и воскрешался несколько раз: [arduino-cmake](https://github.com/queezythegreat/arduino-cmake) → [раздвоенный arduino-cmake](https://github.com/arduino-cmake/arduino-cmake) → [Arduino-CMake-NG](https://github.com/arduino-cmake/Arduino-CMake-NG) → [Arduino-CMake-Набор инструментов](https://github.com/a9183756-gh/Arduino-CMake-Toolchain)., @Edgar Bonet
Самый простой способ сделать это-скопировать файлы заголовка и кода библиотеки в исходный каталог и включить их.
myproject/
myproject.ino
somelib.h
somelib.cpp
В вашем коде вы можете включить "somelib.h".
Недостатком этого является то, что библиотеки должны находиться в одной папке, а не во вложенных папках, поэтому ваш каталог выглядит беспорядочно.
Что касается структуры каталогов всего моего проекта, включая схемы и документацию, мой обычно выглядит так:
myproject/
schematics/ - eagle files or whatever you may have
docs/ - include relevant datasheets here
test/ - any test cases or other code to test parts of the system.
myproject/ - since Arduino code must be in a directory of the same name
myproject.ino
...
Еще одним недостатком является то, что мне придется копировать одни и те же библиотеки во многих проектах. Кроме того, мне непонятно, помещаете ли вы туда только СВОИ библиотеки или также сторонние библиотеки?, @jfpoilpret
Первый момент: на самом деле это не недостаток, это просто побочный эффект сохранения библиотек и исходного кода проекта вместе, как вы хотели, с помощью управления версиями. Что делать, если другому проекту потребуется обновленная версия библиотеки? Что, если вы измените его? Второй момент: и то, и другое будет работать., @sachleen
Согласованный. Теперь, куда вы помещаете другие файлы для проекта и библиотек (математика, документация)? В поддире, в папке проекта, снаружи?, @jfpoilpret
@jfpoilpret Я обновил свой ответ с помощью моей типичной структуры каталогов., @sachleen
Спасибо за обновление, +1 за ваш ответ. Мне любопытно посмотреть, что другие делают для своих собственных проектов., @jfpoilpret
Еще один вопрос: после дублирования ваших собственных библиотек в различные проекты, которые их используют, в одном из этих проектов могут быть обнаружены некоторые ошибки или улучшения дублированной библиотеки; затем вам придется снова везде дублировать изменения, что чревато ошибками и отнимает много времени! Кроме того, если вы хотите "открыть" одну из этих библиотек самостоятельно (вне любого проекта) для использования другими, вам также необходимо скопировать изменения в нее. У вас есть какой-нибудь трюк, чтобы обойти эту проблему?, @jfpoilpret
Я не. Среда разработки Arduino IDE довольно ограничена во многих отношениях. Возможно, вам захочется изучить лучшую среду для работы, в которой для этого будет лучшая поддержка. Люди создали пользовательские файлы, которые позволяют импортировать библиотеки и из других источников., @sachleen
Это не очень хороший способ организации проектов с точки зрения лицензий на программное обеспечение. Если вы включаете в свой проект сторонние библиотеки, которые могут иметь разные лицензии, вы можете нарушить их, как только начнете делиться файлом проекта. Различные лицензии с открытым исходным кодом *как правило* несовместимы друг с другом., @asheeshr
@AsheeshR наличие всех ваших файлов в одном каталоге, чтобы среда разработки arduino не жаловалась, вообще не является хорошим способом организации проектов. Это просто *способ*. Не стесняйтесь предлагать лучшее решение. Я не знаю ни одного, который все еще позволял бы вам использовать программное обеспечение Arduino., @sachleen
Мой способ организации проекта arduino довольно прост, все мои проекты являются репозиториями git, так что есть, по крайней мере, следующее:
- проект/
- проект.ino
- Файл Makefile
У меня есть предпочтение использовать мой любимый редактор и файл создания, который я создал для работы с большинством вариантов использования (и я даже улучшил тот, которым скоро поделюсь).
Что касается библиотек, я предпочитаю хранить их в качестве собственных репозиториев и использовать подмодуль git для включения их в проект. Поскольку многие библиотеки, написанные сообществом, используются совместно в качестве репозиториев git, это хорошее универсальное решение. Затем в файле Makefile мне просто нужно добавить путь к библиотекам, который я хочу включить в переменную LOCALLIBS.
Хотя для некоторых проектов имеет смысл инкапсулировать библиотеки в библиотеку уровня аппаратной абстракции, созданную для проекта, тогда я предпочитаю использовать такой путь, как:
проект
проект.ino
Файл Makefile
project_hal_lib
библиотека 1
библиотека 2
библиотека 3
- …
Тем не менее, с arduino 1.5.x предлагается новый способ указания библиотек, который позволит создавать и создавать проекты arduino так же, как мы уже делаем с pipy и virtualenv в python, т. Е. вы определяете набор необходимых библиотек, и они загружаются.
Я работал над аналогичным ответом. Ты меня опередил!, @asheeshr
+1 Спасибо! Этот способ выглядит довольно интересно. Мне придется попробовать на этой неделе (хотя сначала мне нужно узнать, как настроить файл Makefile)., @jfpoilpret
@AsheeshR если ваш ответ был похожим, это означает, что в нем все еще есть некоторые различия, верно? Мне было бы интересно узнать об этом!, @jfpoilpret
на самом деле основными изменениями, которые появятся в следующей версии моего Makefile, будет возможность либо "прошивать" с помощью программатора, либо "загружать" с помощью загрузчика. А также обработка слияния загрузчика с прошивкой. Я также написал установщик предохранителей в файле makefile., @zmo
@zmo щедрость заслужена, хотя ваше решение для создания файлов не может работать в моей ситуации (с использованием Windows, но я не указал этот момент). Но я убежден, что использование одного из существующих доступных решений makefile-это правильный путь. Как только я найду для себя одну из двух, я опубликую свой ответ здесь., @jfpoilpret
ну, на самом деле я разработал свой файл Makefile так, чтобы он каким-то образом был совместим с Windows… хотя в то время у меня не было Windows, чтобы проверить это! Так что определенно, если вы хотите помочь его улучшить, пожалуйста :-), @zmo
Итак , что такое "arduino 1.5.x новый способ указания библиотек"? Это слишком много слов. Не могли бы вы привести пример?, @Joke Huang
Когда я писал этот ответ, он был довольно новым, но сегодня он широко используется. Лучший способ найти пример (помимо чтения спецификации) - это просмотреть github: https://github.com/search?q=%22library.properties%22 . Примером может быть [первое совпадение](https://github.com/lewisxhe/BMA423_Library/blob/master/library.properties). К сожалению, за последние несколько лет я мало занимался Arduino, и я больше не в курсе лучших практик, поэтому я не знаю, как далеко они продвинулись в этом и возможен ли такой pip, как CLI, или нет., @zmo
Подмодули Git чрезвычайно эффективны, когда дело доходит до организации нескольких вложенных репозиториев. Работа с несколькими библиотеками из разных источников и даже с частями вашего собственного проекта, которые могут храниться в разных источниках, становится простой с помощью подмодулей git.
Структура каталогов
Одним из способов организации ваших проектов было бы:
Проект - Родительский каталог
ProjectA - Каталог исходного кода, содержащий код Arduino
- Проект.ino
- заголовок.h
- implementation.cpp
документы - Ваш основной каталог документации
схемы - они могут храниться отдельно в отдельном репо Git или в части одного и того же репо
библиотеки - Это будут содержать ваши сторонние библиотеки.
- libA - Они могут храниться в качестве сторонних репозиториев
- libC - ...
лицензия
Файл README
Makefile - Необходим для обработки зависимостей между каталогами
Рабочий процесс
Вы будете следовать своему обычному циклу внесения изменений, добавления и фиксации в отношении основного репозитория. С суб-репозиториями все становится интереснее.
У вас есть возможность добавить репозиторий в родительский каталог вашего основного репозитория. Это означает, что любая часть вашей структуры каталогов, т. е. документы, схемы и т.д., Может храниться как отдельное хранилище и постоянно обновляться.
Вы можете сделать это с помощью подмодуля git добавить команду <repo.git><repo.git>
. Чтобы поддерживать его в актуальном состоянии, вы можете использовать обновление подмодуля git <путь><путь>
.
Когда дело доходит до обслуживания нескольких сторонних библиотек в вашем репозитории, чтобы каждая из них могла управляться самостоятельно или при необходимости обновляться, подмодуль git снова спасает ваш день!
Чтобы добавить репозиторий третьей стороны в библиотеки, используйте подмодуль команды git add <lib1.git> libs/lib1<lib1.git>
. Затем, чтобы сохранить библиотеку в фиксированной точке цикла выпуска, проверьте библиотеку и сделайте фиксацию. Чтобы поддерживать библиотеку в актуальном состоянии, используйте команду git подмодуль обновить <путь><путь>
.
Теперь вы можете поддерживать несколько репозиториев в главном репозитории, а также несколько сторонних библиотек на их независимых стадиях выпуска.
По Сравнению С Подходом С Одним Каталогом
Хотя подход с одним каталогом является самым простым, невозможно управлять версиями частей каталога без особых проблем. Следовательно, простой подход не позволяет разместить в проекте различные репозитории с различными состояниями.
Этот подход позволяет поддерживать несколько репозиториев, но при этом возникает необходимость в файле Makefile для обработки процесса компиляции и компоновки.
В зависимости от сложности вашего проекта может быть выбран оптимальный подход.
+1, но просто в качестве примечания: подмодули Git довольно нестабильны и, скорее всего, сбиваются с пути. Не имеет значения, используете ли вы один каталог или несколько (например, "поставщик", "node_modules" и т. Д.). Git ссылается на них и отслеживает это., @kaiser
"Не имеет значения, используете ли вы один каталог или несколько (например, поставщик, node_modules и т. Д.)". Я не понял эту часть. Не могли бы вы уточнить?, @asheeshr
Вы могли бы использовать файл makefile https://github.com/sudar/Arduino-Makefile для компиляции кодов Arduino. Вам не обязательно нужна IDE.
Я пробовал, но, к сожалению, это будет работать только на машинах Unix, и мне нужна поддержка Windows. В настоящее время я оцениваю другой проект, основанный на CMake, но я еще не закончил с ним. Я опубликую ответ, когда определюсь с инструментом., @jfpoilpret
Вероятно, действительно поздно для игры, но это достаточно популярный вопрос, на который можно ответить, используя несколько иные методы, чем те, которые уже опубликованы.
Если вам нужно поддерживать совместимость с IDE Arduino напрямую, вы можете использовать что-то вроде того, что я описал здесь:
https://gitlab.com/mikealger/ExampleArduinoProjectStructure/tree/master/ExampleSketchBook
Я основал большую часть этого на примечаниях Arduino-структуре проекта и процессе сборки, а также на некоторых советах, которые я получил за эти годы.
Я действительно не знаю, почему это так трудно найти непосредственно на страницах Arduino, это кажется глупым, исходя из полупрофессионального опыта, что процесс сборки настолько тупой.
удачи вам там
----отредактированная ссылка на примечания к структуре проекта, которые я использовал, поскольку они были удалены они сейчас здесь
Ссылка на gitlab, похоже, не работает, @Greenonline
странно, работает ли это без прямой связи ? т. е. https://gitlab.com/mikealger/ExampleArduinoProjectStructure, @Mike Alger
На самом деле обе ссылки работают в Firefox, но ни одна из них не работает в моей устаревшей версии Chrome 49.0.2623.112 (64-разрядная версия). Думаю, беспокоиться не о чем. :-), @Greenonline
хорошо, страница грэхамвидемана теперь исчезла, но у машины обратного пути есть копия по адресу https://web.archive.org/web/20161106122158/https://grahamwideman.wikispaces.com/Arduino+--+Проект+структура+и+сборка+процесс, @Mike Alger
MyProject
|_MyProject
|_MyProject.ino
|_data
| |_documentation
| |_PCB
| |_schematics
|_src
|_MyProjectLibrary1
|_ThirdPartyLibrary
Папка MyProject (корневой каталог репозитория)
Причина, по которой я предлагаю, казалось бы, избыточную корневую папку MyProject, заключается в том, что вы упомянули об использовании GitHub. Когда вы загружаете (а не клонируете) содержимое репозитория GitHub, имя ветви или тега добавляется к имени репозитория (например
, MyProject-master
). В среде IDE Arduino требуется, чтобы имя папки скетча совпадало с именем файла скетча. Если вы откроете файл .ino, который находится в папке, не соответствующей имени скетча, IDE Arduino предложит вам создать папку с соответствующим именем скетча и переместить скетч в эту папку. В дополнение к тому, что это не очень хороший начальный опыт для пользователя, большая проблема заключается в том, что среда IDE Arduino может не копировать все другие связанные файлы во вновь созданную папку, что может привести к тому, что программа больше не будет компилироваться. Помещая скетч во вложенную папку, вы избегаете изменения имени папки скетча на GitHub.
Если проблема с именем файла GitHub не является для вас проблемой, то избыточная корневая папка не нужна.
папка с данными
Я рекомендую использовать подпапку данных для ваших некодовых файлов, потому что в среде IDE Arduino есть специальное обращение с подпапками с таким именем. Они копируются в новое местоположение, когда вы делаете файл > Сохранить как...>. Вложенные папки с любым другим именем не являются.
папка src
Подпапка src
обладает особым свойством разрешать рекурсивную компиляцию. Это означает, что вы можете оставить библиотеки в этой папке и включить их в свой скетч следующим образом:
#include "src/MyProjectLibrary1/MyProjectLibrary1.h"
#include "src/ThirdPartyLibrary/ThirdPartyLibrary.h"
Структура папок формата библиотеки Arduino 1.5 также поддерживается, вам нужно только соответствующим образом настроить инструкции #
include.
Обратите внимание, что только Arduino IDE 1.6.10 (arduino-builder 1.3.19) и более новые версии поддерживают рекурсивную компиляцию скетчей.
К сожалению, некоторые библиотеки используют неправильный синтаксис #include для локальных включений файлов (например
, #include <ThirdPartyLibrary.h><ThirdPartyLibrary.h>
вместо #include "ThirdPartyLibrary.h"
). Это по-прежнему работает, когда библиотека установлена в одну из папок библиотек Arduino, но не работает, когда библиотека поставляется в комплекте с скетчем. Поэтому для использования этого способа в некоторых библиотеках могут потребоваться незначительные изменения.
Я очень предпочитаю это альтернативе сброса всех библиотечных файлов в корневой папке скетча, потому что это грязно, и каждый файл библиотеки будет отображаться в среде разработки Arduino в виде вкладок при открытии скетча (конечно, любые исходные файлы, которые вы хотите редактировать из среды разработки Arduino, должны быть помещены в корневую папку скетча).
Возможность использовать встроенные библиотеки на месте также соответствует другой вашей цели:
отправьте другу, чтобы он построил как можно проще
Устранение требования ручной установки библиотек значительно упрощает использование проекта.
Это также позволит избежать любых конфликтов с другими версиями библиотечных файлов с тем же именем, которые могут быть установлены ранее.
- Бесполезная проводка коробки и код
- Как можно автоматически тестировать исходный код Arduino (непрерывная интеграция)?
- Скрытие пароля WLAN при отправке на GitHub
- Примеры больших кодовых баз Arduino и как они организованы?
- Включить тег Git (или версию SVN) в скетч Arduino?
- Резервное копирование и восстановление прошивки
- Может ли датчик 12 В, быть подключен к выходному сигналу 5 В Arduino Uno
- Какова правильная структура папок для включения локальных заголовков в мой проект Arduino?
Я тоже боролся с этим. У меня есть два проекта, которым нужны разные версии внешней библиотеки, и в настоящее время они находятся вне контроля версий., @Cybergibbons
Пожалуйста, обратите внимание для дальнейшего исследования, что это ***Менеджеры пакетов***. JavaScript получил Node.js/npm и bower, PHP получил PEAR и Composer и т. Д., @kaiser