Se você deseja que o projeto seja independente, é possível colocar as dependências da biblioteca na pasta de esboço. Portanto, a estrutura de pastas do esboço Foo com a dependência da biblioteca Logging seria algo parecido com isto:
Foo
|_Foo.ino
|_src
|_Logging
|_Logging.h
|_Logging.cpp
E no Foo.ino você incluirá a biblioteca assim:
#include "src/Logging/Logging.h"
Infelizmente, algumas bibliotecas usam a sintaxe de inclusão incorreta, que ainda funciona quando a biblioteca está instalada em uma das pastas de bibliotecas, mas não quando localizada na pasta de esboço. A biblioteca de log usa a sintaxe de inclusão correta, mas às vezes para colocar bibliotecas na pasta de esboço, você precisará corrigir isso. Por exemplo, digamos que você tenha uma biblioteca chamada Bar e no Bar.cpp você vê isto:
#include <Bar.h>
Isso não funcionará porque, se instalado na pasta de esboço Bar.h, não será localizado em um dos caminhos de inclusão padrão, você precisará editar o Bar.cpp e alterar a sintaxe de inclusão para:
#include "Bar.h"
O que fará com que a pasta local seja procurada pelo arquivo incluído.
A desvantagem deste sistema é que você pode acabar com várias cópias de uma biblioteca, por isso é mais trabalhoso atualizar ou modificar cada cópia. Obviamente, isso também pode ser um benefício, pois cada projeto pode ter sua própria versão de trabalho conhecida da biblioteca que não será afetada por nenhuma atualização que você possa fazer na mesma biblioteca usada em outros projetos.
Geralmente, apenas adiciono instruções sobre como instalar dependências da biblioteca da maneira usual na documentação de um projeto. Isso deve estar dentro dos recursos do usuário médio do Arduino. Se uma versão específica de uma biblioteca for necessária, você o documentará. No entanto, há casos em que eu queria entregar um projeto independente para alguém que não está familiarizado com o uso do IDE do Arduino e foi quando eu usei o sistema descrito acima para todas as bibliotecas de terceiros necessárias.