Composer php 强制编写器符号链接本地包
我正试图找到一个合适的方法来迫使作曲家 符号链接本地包 我知道有一个问题,但它不能回答我的问题。我需要确保它按预期工作,因为我将在CI工作流中使用它 让项目的composer.json类似于:Composer php 强制编写器符号链接本地包,composer-php,Composer Php,我正试图找到一个合适的方法来迫使作曲家 符号链接本地包 我知道有一个问题,但它不能回答我的问题。我需要确保它按预期工作,因为我将在CI工作流中使用它 让项目的composer.json类似于: { "name": "Some project", "type": "project", "minimum-stability": "dev", "prefer-stable": true, "repositories": [{ "type": "p
{
"name": "Some project",
"type": "project",
"minimum-stability": "dev",
"prefer-stable": true,
"repositories": [{
"type": "path",
"url": "packages/*/*"
}]
}
{
"name": "Sample package",
"version": "1.0.0"
}
和包的composer.json(包/示例/包):
{
"name": "Some project",
"type": "project",
"minimum-stability": "dev",
"prefer-stable": true,
"repositories": [{
"type": "path",
"url": "packages/*/*"
}]
}
{
"name": "Sample package",
"version": "1.0.0"
}
让我们假设:
{
"name": "Some project",
"type": "project",
"minimum-stability": "dev",
"prefer-stable": true,
"repositories": [{
"type": "path",
"url": "packages/*/*"
}]
}
{
"name": "Sample package",
"version": "1.0.0"
}
在packagist中发布(commitsample/package:1.0.0
)-未经修改的aaaaaa
composer.json
在提交时本地签出sample/package
bbbbbb
- 我无法在本地修改
样本/包的
版本
1.0.0
,提交aaaaaa
)
命令2:
包从本地版本符号链接到供应商目录(版本1.0.0
,提交bbbbbb
,符号链接)
问题包括:
{
"name": "Some project",
"type": "project",
"minimum-stability": "dev",
"prefer-stable": true,
"repositories": [{
"type": "path",
"url": "packages/*/*"
}]
}
{
"name": "Sample package",
"version": "1.0.0"
}
最低稳定性选项从PackageGist下载软件包?版本约束@dev
允许您强制执行不同的稳定性,但它已经降低到dev
项目配置李>
命令2是否会在任何情况下创建指向本地包的符号链接
有没有比命令2更好的方法来确保本地包得到符号链接
为什么命令1不顾最低稳定性选项从PackageGist下载软件包?版本约束@dev允许您强制执行不同的稳定性,但它已经取决于使用项目配置的dev。
我最好的猜测是,当composer require sample/package
中没有提供版本约束时,composer仍然会尝试找到一个稳定的版本来安装,因为中的“prefere stable”:true
。当您将此选项设置为false
(或明确为包提供@dev
版本约束)时,您应该看到Composer使用最新的可用版本(dev master
on commitbbbbbbbb
)
命令2是否会在任何情况下创建指向本地包的符号链接?
并非所有情况下都如此。您可以使用“symlink”:true
选项强制Composer始终对包进行符号链接
发件人:
如果可能,本地包将被符号链接,在这种情况下,控制台中的输出将从读取符号链接。/../packages/my package
。如果无法进行符号链接,将复制包。在这种情况下,控制台将输出镜像自。/../packages/my package
您可以通过“symlink”:true
强制使用symlink,或通过“symlink”:false
选项强制使用镜像,而不是默认的回退策略。在部署或从单一存储库生成包时,强制镜像非常有用
有没有比命令2更好的方法来确保本地包得到符号链接?
您可能应该避免从composer.json
中删除“preference stable”:true
,因为这会影响所有依赖项
我建议您只需确保明确要求示例/包的@dev
版本,并为本地存储库设置“symlink”:true
。这将导致如下结果:
{
"name": "Some project",
"type": "project",
"minimum-stability": "dev",
"prefer-stable": true,
"repositories": [{
"type": "path",
"url": "packages/*/*",
"symlink": true
}],
"require": {
"sample/package": "@dev"
}
}
如果@Maciek Lewkowicz提供的非常有用的信息不起作用,那么您可能处于这种情况:
您正在使用特定的分支(例如,devmaster
)李>
您正在使用的分支来自您的远程存储库李>
您试图对同一分支进行符号链接,但这次使用的是路径(因此,您在composer.json
中更改的唯一内容是包的源,在composer.json
文件的repositories
键中设置repo)
在这种情况下,简单的composer更新将不起作用:composer不会拦截更改:因为composer与您将存储库从远程路径更改为本地路径无关。它只检查分支是否相同,因此根本不更新
因此,在这种情况下,什么都不起作用:使用symlink:force
也不起作用,也不改变源代码的首选项等等
唯一有效的办法是更换分支
例如,您的composer.json
如下:
{
...
"require": {
...
- "your/package": "dev-master",
+ "your/package": "dev-dev",
...
},
...
"repositories": [
{
"type": "path",
"url": "/Path/To/Your/Local/package"
}
]
}
这里的dev-dev
是一个名为dev
的新分支:将分支从dev-master
更改为dev-dev
将强制Composer再次下载包,因为所需的分支不再是dev-master
在再次下载包时,Composer还将检查新源现在是否为本地路径,因此它将对文件夹进行符号链接。这可能不起作用的另一个原因是当存储库中有多个条目时。Composer将使用它首先在其中找到包的存储库定义
在我们的例子中,我们使用一个定制的Satis存储库。在satis repo之后定义本地包时,它永远不会进行符号链接,而是始终使用satis版本。首先定义本地包时,它确实起作用
工作示例:
"repositories": {
"our/local-package": {
"type": "path",
"url": "../../some-local-package",
"options": {
"symlink": true
}
},
"satis": {
"type": "composer",
"url": "http://our.satis.url/"
}
}
然后调用composer require我们的/local包:@dev
来扩展一下已经很好的答案,我遇到了同样的问题,但解决方案略有不同:
当您的本地包和远程repo中有相同的可用“版本”(分支、标记、哈希)时,如果composer无法解析本地包的依赖项,则只要可以解析这些依赖项,它将从远程repo中无声地拖动版本
为了调试它,您可以将一些古怪的版本(例如,100
)添加到本地包package.json