Composer php 强制编写器符号链接本地包

Composer php 强制编写器符号链接本地包,composer-php,Composer Php,我正试图找到一个合适的方法来迫使作曲家 符号链接本地包 我知道有一个问题,但它不能回答我的问题。我需要确保它按预期工作,因为我将在CI工作流中使用它 让项目的composer.json类似于: { "name": "Some project", "type": "project", "minimum-stability": "dev", "prefer-stable": true, "repositories": [{ "type": "p

我正试图找到一个合适的方法来迫使作曲家 符号链接本地包

我知道有一个问题,但它不能回答我的问题。我需要确保它按预期工作,因为我将在CI工作流中使用它

让项目的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"
}
和包的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"
}
  • sample/package:1.0.0
    在packagist中发布(commit
    aaaaaa
    )-未经修改的
    composer.json
  • sample/package
    在提交时本地签出
    bbbbbb
  • 我无法在本地修改
    样本/包的
    版本
命令1:

从PackageGist获取包(版本
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"
}
  • 为什么命令1不顾
    最低稳定性
    选项从PackageGist下载软件包?版本约束
    @dev
    允许您强制执行不同的稳定性,但它已经降低到
    dev
    项目配置
  • 命令2是否会在任何情况下创建指向本地包的符号链接
  • 有没有比命令2更好的方法来确保本地包得到符号链接
  • 为什么命令1不顾最低稳定性选项从PackageGist下载软件包?版本约束@dev允许您强制执行不同的稳定性,但它已经取决于使用项目配置的dev。 我最好的猜测是,当
    composer require sample/package
    中没有提供版本约束时,composer仍然会尝试找到一个稳定的版本来安装,因为
    中的“prefere stable”:true
    。当您将此选项设置为
    false
    (或明确为包提供
    @dev
    版本约束)时,您应该看到Composer使用最新的可用版本(
    dev master
    on commit
    bbbbbbbb

    命令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