web-dev-qa-db-fra.com

Composer - en utilisant un référentiel local

Je suis un débutant Composer et j'essaie de rendre un projet dépendant d'un autre, alors que les deux projets n'existent que sur ma machine locale.

Le composer.json dans mon projet de bibliothèque (ProjectA) est:

{
    "name" : "project/util",
    "type" : "library"
}

J'ai initialisé git dans le dossier de base de ce projet.

Mon composer.json dans le projet en fonction du premier (ProjectB):

{
    "repositories": [
        {
            "name" : "util", 
            "type" : "git",
            "url" : "/d/workspaces/util"
        }   
    ],

    "require": {
        "project/util" : "*"
    },
}

Quand je lance composer install de ProjectB, j'obtiens l'erreur suivante:

[RuntimeException]
Failed to clone , could not read packages from it
fatal: repository '' does not exist

Je suppose que quelque chose ne va pas avec l'URL du référentiel, mais je ne sais pas quoi d'autre y écrire.

46
Banana

Autoload local package using composer (sans aller à packagist chaque fois que vous changez).

Il y a plusieurs façons de le faire, j'en couvrirai 2:

Dans tous les cas, nous avons 2 parties principales:
- le paquet local (le code que nous ne voulons pas publier sur packagist pour pouvoir le charger automatiquement dans notre compositeur de projet).
- le projet principal (la base de code qui doit utiliser le code de package local, peut être un autre package et/ou n'importe quel projet).


Méthode 1: (espace de noms direct)

Ouvrez le projet principal composer.json fichier et charge automatiquement les espaces de noms des packages locaux à l'aide de n'importe quelle méthode (PSR-4, PSR-0, ...).

exemple:

si dans le composer.json du package local, nous avons:

  "autoload": {
    "psr-4": {
      “Local\\Pack\\": "library"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "Local\\Pack\\Tests\\": "tests"
    }
  },

puis dans le composer.json du projet principal on devrait avoir:

  "autoload": {
    "psr-4": {
      "Mahmoudz\\Project\\": "src",
      "Local\\Pack\\": "../path/to/local/pack/library”                   << referencing the other local package
    }
  },
  "autoload-dev": {
    "psr-4": {
      "Mahmoudz\\Project\\Tests\\": "tests"
    }
  },

Avantages:
- vous ne touchez pas le répertoire des fournisseurs (l'exécution de composer par erreur ne remplacera pas vos modifications locales)
- vous n'avez pas besoin que votre colis soit sur packagist pour l'utiliser
- vous travaillez au même endroit (le package local) et les modifications sont automatiquement chargées dans le projet principal
Inconvénients:
- vous ne pouvez pas publier le compositeur.json en production (nécessite une modification avant la publication pour avoir besoin du vrai package)

Méthode 2: (référentiel local)

Téléchargez le package local à partir d'un référentiel local.

paquet local:
1. initialiser git dans le paquet (même si vous ne voulez pas l'utiliser - pas besoin de commettre quoi que ce soit)
2. ajoutez le fichier composer.json. Dans le fichier, assurez-vous que vous disposez des éléments suivants:

"name": "vendor-name/package-name",  

"autoload": { …   // use whichever method you prefer, but make sure it’s being loaded correctly

"minimum-stability": "dev"  
  1. composer dump-autoload

projet principal:
1. éditez votre composer.json pour qu'il contienne les éléments suivants:

  "repositories": [
    {
      "type": "vcs",
      "url": "/full/path/to/the/local/package/package-name"
    }
  ],
  "require": {
    "vendor-name/package-name": "dev-master"
  },
  1. compositeur mise à jour nom-fournisseur/nom-package
  2. vérifiez maintenant votre répertoire de fournisseurs, vous devriez voir le nom du fournisseur/nom du package

REMARQUE: chaque fois que vous apportez des modifications dans le package local (pas le fournisseur), vous devez git commit alors vous pouvez composer mettre à jour le projet principal, il obtiendra la dernière copie du dépôt dans le principal répertoire des fournisseurs du projet.

Avantage:
- vous ne touchez pas le répertoire du fournisseur (l'exécution de composer par erreur ne remplacera pas vos modifications locales) - vous n'avez pas besoin que votre paquet soit sur packagist pour l'utiliser il
Inconvénient:
- vous devez continuer à valider vos modifications (dans le package local) puis à exécuter composer update dans le projet principal
- vous ne pouvez pas publier le compositeur.json en production (nécessite une modification avant la publication pour avoir besoin du vrai package)

42
Mahmoud Zalt

Je pense que vous avez juste une mauvaise syntaxe. Le type doit simplement être VCS, puis composer détermine de quel type de VCS il s'agit.

Ainsi, dans votre projet B, l'entrée pour les référentiels doit être:

"repositories": [
    {
        "type": "vcs",
        "url" : "/d/workspaces/util"
    }
],

Vous n'avez pas besoin de nommer la bibliothèque disponible dans /d/workspaces/util. Composer analysera le fichier composer.json dans ce répertoire et saura quel nom de projet y est disponible, et utilisera le projet de ce répertoire de préférence à une version répertoriée sur packagist ou autre référentiel.

23
Danack

En plus de la solution de Danack: Changer le chemin de/d/à d:/a fonctionné pour moi.

Comme ça:

"repositories": [
    {
        "type": "vcs",
        "url" : "d:/workspaces/util"
    }
],
2
Max

J'ai trouvé ce tutoriel vraiment utile: https://johannespichler.com/developing-composer-packages-locally/ lorsque je rencontrais des problèmes avec la production de packages locaux

Notez la condition symlink permettant au dossier fournisseur d'être un lien symbolique, ce qui signifie que vous n'avez plus besoin de composer update chaque fois que vous voulez voir le changement

"options": {
        "symlink": true
      }
0
Friendly Code