我是一名Composer初学者,我正在尝试使一个项目依赖于另一个项目,而这两个项目只存在于我的本地机器上.
我的库项目(ProjectA)中的composer.json是:
{
"name" : "project/util",
"type" : "library"
}
Run Code Online (Sandbox Code Playgroud)
我在这个项目的基础文件夹中初始化了git.
我的composer.json在项目中取决于第一个(ProjectB):
{
"repositories": [
{
"name" : "util",
"type" : "git",
"url" : "/d/workspaces/util"
}
],
"require": {
"project/util" : "*"
},
}
Run Code Online (Sandbox Code Playgroud)
当我composer install从ProjectB 运行时,我收到以下错误:
Run Code Online (Sandbox Code Playgroud)[RuntimeException] Failed to clone , could not read packages from it fatal: repository '' does not exist
我认为存储库的url有问题,但我不确定还有什么要写在那里.
Mah*_*alt 45
使用作曲家自动加载本地包(每次更改时都不会打包).
有很多方法可以做到,我将覆盖其中两个:
在所有情况下,我们有两个主要方:
- 本地包(我们不想在packagist上发布的代码,以便能够在我们的项目编写器中自动加载它).
- 主项目(需要使用本地包代码的代码库,可以是另一个包和/或任何项目).
Methode 1 :(直接名称空间)
打开主项目composer.json文件,并使用任何方法(PSR-4,PSR-0,...)自动加载本地程序包命名空间.
例:
如果在本地包的composer.json中我们有:
"autoload": {
"psr-4": {
“Local\\Pack\\": "library"
}
},
"autoload-dev": {
"psr-4": {
"Local\\Pack\\Tests\\": "tests"
}
},
Run Code Online (Sandbox Code Playgroud)
然后在主项目的composer.json中我们应该:
"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"
}
},
Run Code Online (Sandbox Code Playgroud)
优点:
- 你没有触及供应商目录(错误地运行composer update不会覆盖你的本地更改)
- 你不需要你的包在packagist上使用它
- 你在一个地方工作(本地包)并且更改会自动加载到主项目中
缺点:
- 您无法在生产时发布composer.json(需要在发布之前进行编辑以要求真正的包)
Methode 2 :(本地存储库)
从本地存储库下载本地程序包.
本地包:
1.初始化包中的 git(即使你不想使用它 - 不需要提交任何东西)
2.添加composer.json文件.在文件中,请确保您具有以下内容:
"name": "vendor-name/package-name",
"autoload": { … // use whichever method you prefer, but make sure it’s being loaded correctly
"minimum-stability": "dev"
Run Code Online (Sandbox Code Playgroud)
composer dump-autoload 主项目:
1.编辑你的composer.json以包含以下内容:
"repositories": [
{
"type": "vcs",
"url": "/full/path/to/the/local/package/package-name"
}
],
"require": {
"vendor-name/package-name": "dev-master"
},
Run Code Online (Sandbox Code Playgroud)
注意:每当你在本地软件包(而不是供应商)中进行更改时,你需要git commit然后你可以编写更新主项目,它将获得repo的最新副本到主项目供应商目录.
优点:
- 你没有触及供应商目录(错误地运行composer update不会覆盖你的本地更改) - 你不需要你的包在packagist上使用它
缺点:
- 你必须继续提交你的更改(在本地包中)然后在主项目中运行composer update
- 你无法在生产中发布composer.json(需要在发布之前进行编辑以要求真正的包)
Dan*_*ack 24
我觉得你的语法错了.该类型应该只是VCS,然后作曲家计算出它是什么类型的VCS.
所以在你的项目B中,存储库的条目应该是:
"repositories": [
{
"type": "vcs",
"url" : "/d/workspaces/util"
}
],
Run Code Online (Sandbox Code Playgroud)
您无需为可用的库命名/d/workspaces/util.Composer将扫描该目录中的composer.json文件,并知道那里有哪些项目名称,并使用该目录中的项目优先于packagist或其他存储库上列出的版本.
小智 13
最简单的方法是使用 type=path https://getcomposer.org/doc/05-repositories.md#path
{
"repositories": [
{
"type" : "path",
"url" : "/d/workspaces/util"
}
],
"require": {
"project/util" : "*"
},
}
Run Code Online (Sandbox Code Playgroud)
当我遇到本地包生产问题时,我发现本教程非常有用:https : //johannespichler.com/developing-composer-packages-locally/
请注意symlink允许供应商文件夹成为符号链接的条件,这意味着您不再需要composer update每次想要查看更改
"options": {
"symlink": true
}
Run Code Online (Sandbox Code Playgroud)