Eu tenho algumas bibliotecas [Foo e Bar] que estou desenvolvendo em conjunto, mas ainda são coisas tecnicamente separadas. Anteriormente, acabei de redefinir o autoloader para like "Foo\\": "../Foo/src"
, mas agora que adicionei uma dependência Guzzle a Foo, Bar vira a tampa porque não é uma de suas dependências.
Estrutura do diretório:
/home/user/src/
Foo/
src/
FooClient.php
composer.json
Bar/
src/
BarClient.php
composer.json
Instrução teórica de carregamento automático: [em Bar / composer.json]
"require": {
"local": "../Foo/composer.json"
}
Código de exemplo:
require('vendor/autoload.php');
$f = new \Bar\BarClient(new \Foo\FooClient());
Como posso resolver isso sem configurar um repositório local do Composer? Quero mantê-los como pacotes separados, apenas aquele requer o outro e, portanto, processa as dependências do outro.
edição pós-resposta:
Graças ao infomaníaco, fiz o seguinte:
Inicializou o repo git:
cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"
Adicionada a configuração do composer:
"require": {
"sammitch/foo": "dev-master"
},
"repositories": [{
"type": "vcs",
"url": "/home/sammitch/src/Foo"
}],
E então composer update
!
php
composer-php
Sammitch
fonte
fonte
sammitch/foo
é o nome do pacote e literalmente não tem nada a ver com onde ele está localizado. Construirá uma lista de pacotes disponíveis com base em seus repositórios configurados, neste caso obtendo o composer.json do repositório git local especificado, e então composer trata do resto. Osammitch/foo
pacote é copiado para avendor
pasta do aplicativo atual da mesma forma que qualquer outro pacote.Respostas:
Você pode usar o recurso de repositórios do Composer
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
Em vez de usar o formato http, especifique um caminho de arquivo no disco.
fonte
A maneira de vincular a um pacote local em desenvolvimento é primeiro adicionar
composer.json
um repositório do projeto principal , como este:Você também precisa ter uma versão especificada em seu pacote de desenvolvimento
composer.json
ou a forma como eu faço isso é exigir que o pacote use@dev
, assim:Deve produzir:
O
@dev
in no comando require é importante, o composer o usa para pegar o código-fonte e fazer um link simbólico para o seu novo pacote.É um sinalizador de estabilidade adicionado à restrição de versão (consulte o link do pacote ).
Os sinalizadores de estabilidade mínima são:
fonte
composer require "vendorname/packagename @dev"
traduz para"require":{ "vendorname/packagename": "@dev" }
no composer.json do seu aplicativo se você deseja executar a instalação do composerDepois de passar algum tempo, finalmente entendi a solução. Talvez seja útil para alguém como eu e economize seu tempo, então decidi que devo compartilhar aqui.
Supondo que você tenha a seguinte estrutura de diretório (em relação ao diretório raiz do projeto):
Neste exemplo, você pode ver que a
local
pasta se destina a projetos aninhados de sua empresa, por exemplobar-project
. Mas você pode configurar qualquer outro layout, se desejar.Cada projeto deve ter seu próprio
composer.json
arquivo, por exemplo, rootcomposer.json
elocal/bar-project/composer.json
. Então, seu conteúdo seria o seguinte:(root
composer.json
:)(
local/bar-project/composer.json
:)Se, por exemplo, você deseja localizar cada projeto em um diretório irmão separado, da seguinte maneira:
- então você precisa vincular ao respectivo diretório na
repositories
seção:Depois disso não se esqueça de
composer update
(ou mesmorm -rf vendor && composer update -v
como a documentação sugere )! Sob o capô, o compositor criará umvendor/your-company/bar-project
link simbólico que visalocal/bar-project
(ou../bar-project
respectivamente).Supondo que seu
public/index.php
seja apenas umfront controller
, por exemplo:Então você
config/composition-root.php
seria:fonte
composer update
com similarcomposer.json
e, portanto, você precisa remover o link simbólico anterior criado pelo composer