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

75

Я долго искал хороший ответ на этот вопрос.

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

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

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

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

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

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

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

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

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

jfpoilpret
источник
Я тоже боролся с этим. У меня есть два проекта, которым нужны разные версии внешней библиотеки, и в настоящее время они находятся вне контроля версий.
Cybergibbons
1
Обратите внимание, что для дальнейшего исследования это менеджеры пакетов . JavaScript получил Node.js / npm и Bower, PHP получил PEAR и Composer и т. Д.
kaiser

Ответы:

30

Мой способ организации проекта arduino довольно прост, все мои проекты - это git-репозитории, поэтому есть как минимум следующее:

У меня есть предпочтение, используя мой любимый редактор и Makefile, который я создал для работы с большинством вариантов использования (и я даже улучшил тот, которым скоро собираюсь поделиться).

Для библиотек я предпочитаю хранить их как свои собственные репозитории и использовать подмодуль git для включения их в проект. Поскольку многие библиотеки, написанные сообществом, являются общими для git-репозиториев, это хорошее общее решение. Затем в Makefile мне просто нужно добавить путь к библиотекам, который я хочу включить в переменную LOCALLIBS .

Хотя для некоторых проектов имеет смысл инкапсулировать библиотеки в библиотеку аппаратного уровня абстракции, созданную для проекта, тогда я предпочитаю использовать путь, такой как:

  • project
    • project.ino
    • Makefile
    • project_hal_lib
      • library1
      • library2
      • library3
      • ...

Тем не менее, в arduino 1.5.x предложен новый способ указания библиотек , который предложит способ создавать и создавать проекты arduino так же, как мы это уже делали с pipy и virtualenv в python, то есть вы определяете набор библиотек, который вам нужен, и они получить загрузки.

ZMO
источник
Я работал над аналогичным ответом. Ты подтолкнул меня на это!
asheeshr
+1 Спасибо! Этот способ выглядит довольно интересно. На этой неделе я попробую (мне сначала нужно проверить, как настроить Makefile).
jfpoilpret
@AsheeshR, если ваш ответ был похожим, это значит, что он все еще имеет некоторые различия, верно? Мне было бы интересно узнать об этом!
jfpoilpret
На самом деле, основными изменениями, которые появятся в следующей версии моего Makefile, будет возможность flashиспользования либо программатора, либо uploadзагрузчика. А также обработка слияния загрузчика с прошивкой. Я также написал встроенный установщик предохранителей.
Zmo
@zmo bounty заслуживает, хотя ваше решение Makefile не может работать в моей ситуации (в Windows, но я не указал этот пункт). Но я убежден, что использование одного из существующих решений makefile - это путь. Как только я найду одну вещь для себя, я опубликую свой ответ здесь.
jfpoilpret
23

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

myproject/
    myproject.ino
    somelib.h
    somelib.cpp

В своем коде вы можете сделать include "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
    ...
sachleen
источник
Другим недостатком является то, что мне придется копировать одни и те же библиотеки во многих проектах. Кроме того, мне не ясно, если вы поместите туда только ВАШИ библиотеки или сторонние библиотеки?
jfpoilpret
Первое замечание: на самом деле это не является недостатком, это всего лишь побочный эффект от объединения библиотек и исходного кода проекта, как вы и хотели, с помощью контроля версий. Что если другому проекту требуется обновленная версия библиотеки? Что если вы изменили это? Второй момент: оба будут работать.
сахлин
1
Я не. Arduino IDE довольно ограничен во многих отношениях. Возможно, вы захотите посмотреть на лучшую среду для работы, в которой есть лучшая поддержка для этого. Люди создали пользовательские файлы, которые позволяют импортировать библиотеки из других источников.
сахлин
1
Это не очень хороший способ организации проектов с точки зрения лицензий на программное обеспечение. Если в ваш проект включены сторонние библиотеки, которые могут иметь разные лицензии, вы можете нарушать их, как только начнете делиться файлом проекта. Различные лицензии с открытым исходным кодом, как правило, не совместимы друг с другом.
asheeshr
3
@AsheeshR, когда все ваши файлы находятся в одном каталоге, поэтому среда IDE arduino не жалуется, это совсем не хороший способ организации проектов. Это просто путь. Не стесняйтесь предложить лучшее решение. Я не знаю ни одного, который все еще позволяет вам использовать программное обеспечение Arduino.
сахлин
20

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

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

Способ организации ваших проектов будет:

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

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

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

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

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

      1. libA - они могут поддерживаться как сторонние репозитории
      2. libC - ...
    • лицензия

    • ПРОЧТИ МЕНЯ

    • Makefile - необходимо обрабатывать зависимости между каталогами

Workflow

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

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

Вы можете сделать это с помощью git submodule add <repo.git>команды. Чтобы держать это в курсе, вы можете использовать git submodule update <path>.

Когда дело доходит до поддержки нескольких сторонних библиотек в вашем репозитории, так что каждая из них может контролироваться версией сама по себе или каждая может быть обновлена ​​в случае необходимости, подмодуль git снова спасет ваш день!

Чтобы добавить стороннее репо в libs , используйте команду git submodule add <lib1.git> libs/lib1. Затем, чтобы поддерживать библиотеку в фиксированной точке цикла выпуска, извлеките библиотеку и сделайте коммит. Чтобы поддерживать библиотеку в актуальном состоянии, используйте команду git submodule update <path>.

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

Против единого подхода к каталогам

Хотя подход с одним каталогом является самым простым, невозможно управлять версиями каталога без особой боли. Следовательно, простой подход не позволяет разместить в хранилище разные репозитории с разными состояниями.

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

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

asheeshr
источник
1
+1, но просто как примечание: подмодули Git довольно нестабильны и, скорее всего, проигрывают. Не имеет значения, если вы используете один каталог или несколько (например vendor, node_modulesи т. Д.). Git ссылается на них и отслеживает их.
Кайзер
«Не имеет значения, используете ли вы один каталог или несколько магазинов (например, vendor, node_modules и т. Д.)». Я не понял эту часть. Не могли бы вы уточнить?
asheeshr
17

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

Arduino-CMake

Первым важным решением, которое я принял, был выбор инструмента сборки, который мог бы работать для моей среды (Windows), но не ограничивался этим (я хочу, чтобы мои проекты легко использовались другими людьми).

Я тестировал различные инструменты Arduino с открытым исходным кодом:

  • Guyzmo Makefile (предложено ответом @zmo): это просто стандартный Makefile, созданный вручную для сборок Arduino; это Unix Makefileно есть хороший порт в Unix делает для ОС Windows ; Тем не менее, к сожалению, этот Makefile работает только для Unix, конечно, он может быть адаптирован для Windows, но я хотел инструмент, который работает "из коробки".
  • Arduino-Makefile (предложенный ответом @adnues): это более продвинутый проект, основанный на Unix Makefile, который стремится быть легко используемым во всех проектах Arduino; задокументировано, что он работает на Mac, Linux и Windows, но поддержка Windows оказалась неверной в моих первых экспериментах (много зависимостей от оболочки Unix).
  • Graduino (не предлагается ни одним ответом): этот инструмент для сборки основан на хорошо известноминструменте Gradle из Groovy World; инструмент, кажется, довольно хорошо сделан, но требует некоторого (небольшого) отличного знания языка и имеет очень мало документации; Я решил не идти с этим из-за бремени установки Groovy и Gradle только для этого (я хотел бы избежать слишком многих предварительных условий для людей, которые хотят построить мои проекты в своих средах).
  • Arduino-CMake (не предлагается ни одним ответом): это кажется лучшим из всех, имеет долгую историю, имеет много сторонников и сопровождающих, хорошо документирован, содержит простые примеры, а также имеет несколько хороших руководств в блоге на тему Сеть, например, здесь и там . Он основан на CMake , «Кроссплатформенной марке».

Я также нашел ArduinoDevel , еще один инструмент сборки Arduino, который я не экспериментировал, который может генерировать файлы Unix Makefiles или ant build.xml ; это казалось интересным, но немного ограниченным с точки зрения функциональности.

Наконец я решил поехать с Arduino-CMake :

  • это было легко установить: просто установите CMake на свой компьютер и скопируйте Arduino-CMake в какой-то каталог, который легко доступен (через относительные пути) из каталогов ваших проектов.
  • примеры работали из коробки (я просто следовал комментариям в CMakeLists.txtфайле конфигурации, чтобы адаптировать свойства, необходимые для моей среды, например, тип Arduino, последовательный порт)
  • Вы можете организовать свои проекты так, как вы хотите
  • он может генерировать файлы конфигурации для различных инструментов сборки ( хотя я только тестировал файлы сборки Unix ), включая проекты Eclipse .
  • в сгенерированном make создается несколько целей для поддержки:

    • сборка библиотек
    • программы сборки
    • загрузка программы на доски
    • запуск серийного монитора
    • и несколько других я еще не проверял

Структура проекта

Поскольку Arduono-CMake не навязывает какую-либо структуру каталогов для вашего проекта, вы можете выбрать ту, которая подходит вам лучше всего.

Вот что я сделал лично (это все еще требует доработки, но сейчас я доволен):

введите описание изображения здесь

Я решил поместить все свои проекты в общий arduino-stuffкаталог (который я фиксирую на github в целом, я знаю, что мог бы использовать подмодули git для лучшей организации на github, но у меня еще не было времени проверить это).

arduino-stuff имеет следующее содержание:

  • build: это каталог, в котором cmake и make сгенерируют все свои вещи (make-файлы, кеш, объектные файлы ...); этот не предан github
  • cmake: это просто копия (не модифицированная) директории Arduino-CMake cmake . Этот попадает на GitHub, так что это легче для тех, кто хочет строить мои проекты
  • CMakeLists.txt: это «глобальная» конфигурация CMake, которая объявляет все значения по умолчанию для моей среды (плата, последовательный порт) и список целевых подкаталогов сборки
  • TaskManager: это мой первый проект, основанный на Arduino-CMake, это библиотека с примерами; эта директория также содержит объект, в CMakeLists.txtкотором указаны цели проекта

Очки для улучшения

Текущее решение не идеально, хотя. Среди улучшений, которые я вижу (это скорее для проекта Arduino-CMake, чтобы включить эти улучшения, если они сочтут нужным):

  • Возможность скопировать каталог библиотеки из текущего проекта в каталог библиотек Arduino
  • Возможность загрузить библиотеку в GitHub
  • Возможность скачать библиотеку с GitHub
jfpoilpret
источник
2
Вы уже пробовали PlatformIO? Возможно, его не было рядом, когда вы задавали этот вопрос .. platformio.org
ohhorob
4
MyProject
|_MyProject
  |_MyProject.ino
  |_data
  |  |_documentation 
  |  |_PCB
  |  |_schematics
  |_src
     |_MyProjectLibrary1
     |_ThirdPartyLibrary

Папка MyProject (корень репозитория)

Причина, по которой я предлагаю создать избыточную MyProjectкорневую папку, заключается в том, что вы упомянули об использовании GitHub. Когда вы загружаете (а не клонируете) содержимое хранилища GitHub, к имени хранилища добавляется ветвь или имя тега (например,MyProject-master). В среде Arduino IDE имя папки эскиза должно совпадать с именем файла эскиза. Если вы откроете INO-файл, который находится в папке, которая не соответствует имени эскиза, среда разработки Arduino предложит вам создать папку с соответствующим именем и переместить эскиз в эту папку. В дополнение к тому, что это не очень хороший начальный опыт для пользователя, большая проблема заключается в том, что Arduino IDE может не копировать все другие связанные файлы во вновь созданную папку, что может привести к тому, что программа больше не будет компилироваться. Поместив скетч в подпапку, вы избегаете изменения GitHub имени папки скетча.

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

папка данных

Я рекомендую использовать dataподпапку для ваших некодовых файлов, потому что в Arduino IDE есть специальная обработка подпапок с таким именем. Они копируются в новое место , когда вы делаете Файл> Сохранить как ... . Подпапок других имен нет.

папка src

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

#include "src/MyProjectLibrary1/MyProjectLibrary1.h"
#include "src/ThirdPartyLibrary/ThirdPartyLibrary.h"

1,5 Библиотека Структура папок формата Arduino также поддерживается, вам нужно только настроить #includeзаявления соответственно.

Обратите внимание, что только Arduino IDE 1.6.10 (arduino-builder 1.3.19) и новее поддерживают компиляцию рекурсивных эскизов.

К сожалению, некоторые библиотеки используют неправильный #includeсинтаксис для локальных файловых включений (например, #include <ThirdPartyLibrary.h>вместо #include "ThirdPartyLibrary.h"). Это все еще работает, когда библиотека установлена ​​в одну из librariesпапок Arduino, но не работает, когда библиотека связана с эскизом. Поэтому некоторые библиотеки могут потребовать незначительных правок, чтобы использовать этот способ.

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

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

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

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

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

per1234
источник
3

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

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

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

Если вам нужно поддерживать совместимость с Arduino IDE напрямую, вы можете использовать что-то вроде того, который я описал здесь:

https://gitlab.com/mikealger/ExampleArduinoProjectStructure/tree/master/ExampleSketchBook

Я основал большую часть этого на заметках Arduino - структура проекта и процесс сборки , а также некоторые советы, которые я взял за эти годы.

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

удачи там

Майк Алджер
источник
Ссылка на
gitlab не работает
странно ли это работает без прямой ссылки? то есть gitlab.com/mikealger/ExampleArduinoProjectStructure
Майк Алджер,
На самом деле обе ссылки работают в Firefox, но ни одна из них не работает в моей устаревшей версии Chrome 49.0.2623.112 (64-разрядная версия). Думаю, не о чем беспокоиться. :-)
Greenonline