我正试图找到一种强制作曲家使用符号链接本地包的正确方法.
我知道有一个问题如何强制Composer下载本地包?但它没有回答我的问题.我需要确保它按预期工作,因为我将在CI工作流程中使用它.
有项目的composer.json像:
{
"name": "Some project",
"type": "project",
"minimum-stability": "dev",
"prefer-stable": true,
"repositories": [{
"type": "path",
"url": "packages/*/*"
}]
}
Run Code Online (Sandbox Code Playgroud)
和package的composer.json(packages/sample/package):
{
"name": "Sample package",
"version": "1.0.0"
}
Run Code Online (Sandbox Code Playgroud)
我们假设:
sample/package:1.0.0发表在packagist(提交aaaaaa) - 未经修改composer.jsonsample/package 本地在提交时签出 bbbbbbversion在sample/package本地修改命令1:
$ composer require sample/package
Run Code Online (Sandbox Code Playgroud)
包从packagist(版本1.0.0,提交aaaaaa)获取.
命令2:
$ composer require sample/package:@dev
Run Code Online (Sandbox Code Playgroud)
包从本地版本到供应商目录(版本1.0.0,提交bbbbbb,符号链接)符号链接.
问题是:
minimum-stability?版本约束@dev允许您强制执行不同的稳定性,但它已经归结为dev项目配置.小智 12
我最好的猜测是,当没有提供版本约束时composer require sample/package,Composer仍会尝试找到一个稳定版本来安装,因为"prefer-stable": true.当您将此选项设置为false(或@dev明确提供包的版本约束)时,您应该看到Composer使用最新的可用版本(dev-master在提交时bbbbbb).
并非在所有情况下.您可以强制Composer使用"symlink": true选项始终对包进行符号链接.
来自https://getcomposer.org/doc/05-repositories.md#path:
如果可能,本地包将被符号链接,在这种情况下,控制台中的输出将从中读取符号链接
../../packages/my-package.如果无法进行符号链接,则将复制包.在这种情况下,控制台将输出Mirrored../../packages/my-package.您可以强制使用符号链接
"symlink": true或使用"symlink": false选项镜像,而不是默认回退策略.从单个存储库部署或生成包时,强制镜像非常有用.
您应该避免掉线"prefer-stable": true,composer.json因为这会影响所有依赖项.
我建议您确保明确要求@dev版本为本地存储库sample/package并"symlink": true为其设置.这将导致类似于:
{
"name": "Some project",
"type": "project",
"minimum-stability": "dev",
"prefer-stable": true,
"repositories": [{
"type": "path",
"url": "packages/*/*",
"symlink": true
}],
"require": {
"sample/package": "@dev"
}
}
Run Code Online (Sandbox Code Playgroud)
如果@Maciek Lewkowicz 提供的非常有用的信息不起作用,那么您可能处于这种情况:
dev-master);composer.json是包的源repositories,在composer.json文件的键中设置 repo )。在这种情况下,一个简单的方法是composer update行不通的:Composer 不会拦截更改:因为 Composer 与您将存储库从远程更改为本地路径无关。它只检查分支是否相同,因此根本不更新。
因此,在这种情况下,什么都不起作用:它无法使用,symlink: force也无法更改有关源的首选项等等。
唯一可行的方法是更改分支。
因此,例如,您composer.json将是这样的:
{
...
"require": {
...
- "your/package": "dev-master",
+ "your/package": "dev-dev",
...
},
...
"repositories": [
{
"type": "path",
"url": "/Path/To/Your/Local/package"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这dev-dev是一个名为 的新分支dev:将分支从 更改dev-master为dev-dev将强制 Composer 再次下载包,因为所需的分支dev-master不再存在。
在再次下载包时,Composer 还将检查新源现在是否为本地路径,因此它将符号链接该文件夹。
这可能不起作用的另一个原因是,当您在 repository. Composer 将使用它首先在其中找到包的存储库定义。
在我们的例子中,我们使用自定义 Satis 存储库。在 satis 存储库之后定义本地包时,它永远不会符号链接并始终使用 Satis 版本。首先定义本地包时,它确实有效。
工作示例:
"repositories": {
"our/local-package": {
"type": "path",
"url": "../../some-local-package",
"options": {
"symlink": true
}
},
"satis": {
"type": "composer",
"url": "http://our.satis.url/"
}
}
Run Code Online (Sandbox Code Playgroud)
然后打电话 composer require our/local-package:@dev
| 归档时间: |
|
| 查看次数: |
5418 次 |
| 最近记录: |