Как организовать структуру проектов Arduino для удобства управления версиями?

Я уже давно ищу хороший ответ на этот вопрос.

Как правило, любой проект Arduino, кроме самого простого, будет включать в себя:

  • Основной файл исходного кода MyProject.ino
  • Библиотеки, относящиеся к проекту (MyProjectLibrary1.h, MyProjectLibrary1.cpp...)
  • Библиотеки сторонних производителей (как правило, с бесплатным открытым исходным кодом, добавленные вручную в каталог библиотек Arduino)
  • Схемы, схемы печатных плат
  • Документация
  • ...

Все это затрудняет управление исходным кодом всего кода и документа одного проекта (например, в Subversion, Git или GitHub).

Управление системой управления версиями вашего проекта означает управление версиями всех файлов, используемых проектом, включая сторонние библиотеки.

Теперь для одного проекта мне нужно определить структуру каталогов, которая:

  • Включает все файлы проекта, как описано выше
  • Я могу полностью довериться инструменту управления исходным кодом (включая зависимости от сторонних производителей)
  • Я могу проверить в любом месте на своем жестком диске и построить проект оттуда (должно ли это быть одно местоположение, как предписано средой IDE Arduino)
  • Я могу архивироваться в автономный архив, который я могу отправить другу, чтобы он построил его как можно проще (без дополнительной ручной загрузки)

Что я нахожу особенно сложным в проектах Arduino, так это управление зависимостями внешних библиотек. Разработчики Java - проектов имеют для этого репозитории maven, и это очень помогает в управлении всеми внешними хранилищами данных. Но у нас нет эквивалентной системы для библиотек Arduino.

Мне было бы интересно узнать, как другие разработчики проектов Arduino решают эти аспекты в своих собственных проектах.

Также обратите внимание, что я открыт для изменения процесса разработки, включая мою IDE (в настоящее время я большую часть времени использую Eclipse с плагином Arduino, а затем гарантирую, что мои проекты также могут работать напрямую с Arduino IDE).

, 👍92

Обсуждение

Я тоже боролся с этим. У меня есть два проекта, которым нужны разные версии внешней библиотеки, и в настоящее время они находятся вне контроля версий., @Cybergibbons

Пожалуйста, обратите внимание для дальнейшего исследования, что это ***Менеджеры пакетов***. JavaScript получил Node.js/npm и bower, PHP получил PEAR и Composer и т. Д., @kaiser


7 ответов


Лучший ответ:

20

Вот путь, которым я, наконец, решил следовать для своих проектов.

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, кэш, объектные файлы...); этот не привязывается к github
  • cmake: это просто копия (неизмененная) каталога 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


25

Самый простой способ сделать это-скопировать файлы заголовка и кода библиотеки в исходный каталог и включить их.

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


36

Мой способ организации проекта 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


21

Подмодули Git чрезвычайно эффективны, когда дело доходит до организации нескольких вложенных репозиториев. Работа с несколькими библиотеками из разных источников и даже с частями вашего собственного проекта, которые могут храниться в разных источниках, становится простой с помощью подмодулей git.

Структура каталогов

Одним из способов организации ваших проектов было бы:

  • Проект - Родительский каталог

    • ProjectA - Каталог исходного кода, содержащий код Arduino

      1. Проект.ino
      2. заголовок.h
      3. implementation.cpp
    • документы - Ваш основной каталог документации

    • схемы - они могут храниться отдельно в отдельном репо Git или в части одного и того же репо

    • библиотеки - Это будут содержать ваши сторонние библиотеки.

      1. libA - Они могут храниться в качестве сторонних репозиториев
      2. 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


4

Вы могли бы использовать файл makefile https://github.com/sudar/Arduino-Makefile для компиляции кодов Arduino. Вам не обязательно нужна IDE.

,

Я пробовал, но, к сожалению, это будет работать только на машинах Unix, и мне нужна поддержка Windows. В настоящее время я оцениваю другой проект, основанный на CMake, но я еще не закончил с ним. Я опубликую ответ, когда определюсь с инструментом., @jfpoilpret


2

Вероятно, действительно поздно для игры, но это достаточно популярный вопрос, на который можно ответить, используя несколько иные методы, чем те, которые уже опубликованы.

Если вам нужно поддерживать совместимость с 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


9
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, должны быть помещены в корневую папку скетча).

Возможность использовать встроенные библиотеки на месте также соответствует другой вашей цели:

отправьте другу, чтобы он построил как можно проще

Устранение требования ручной установки библиотек значительно упрощает использование проекта.

Это также позволит избежать любых конфликтов с другими версиями библиотечных файлов с тем же именем, которые могут быть установлены ранее.

,