Как организовать структуру моих проектов 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).


Я тоже боролся с этим. У меня есть два проекта, которым нужны разные версии внешней библиотеки, и в настоящее время они находятся вне контроля версий.
— 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, то есть вы определяете набор библиотек, который вам нужен, и они получить загрузки.


Я работал над аналогичным ответом. Ты подтолкнул меня на это!
— 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
    ...

Другим недостатком является то, что мне придется копировать одни и те же библиотеки во многих проектах. Кроме того, мне не ясно, если вы поместите туда только ВАШИ библиотеки или сторонние библиотеки?
— 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 для обработки процесса компиляции и компоновки.

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


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

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

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

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

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

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


3

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.