Laravel 5.3 Composer不会更新包依赖项

时间:2016-12-11 08:12:57

标签: php composer-php laravel-5.3

我正在开发我的第一个包。包裹正在运作。

现在我想在我的包(依赖项)中使用Laravels Collective的HTML。

因此我将其添加到了包的作曲家文件中:

(这个composer.json位于包的根目录:/ packages / vendor / package)

{
  "name": "vendor/package",
  "description": "",
  "license": "MIT",
  "authors": [
    {
      "name": "firstname lastname",
      "email": "info@domain.nl"
    }
  ],
  "minimum-stability": "stable",
  "require": {
    "twbs/bootstrap": "dev-master",
    "laravelcollective/html": "5.3.*"
  }
}

我在Laravel自己的composer.json中包含了这个包:

...
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/",
        "Vendor\\Package\\": "packages/vendor/package/src"
    }
},
...

当我做作曲家更新时,包的依赖关系不会更新。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

如果您的包尚未上传到packagist.org,则必须定义本地编写器存储库。在Laravels的应用程序composer.json内添加一个本地存储库,如下所示:

"repositories": [
    {
        "type": "path",
        "url": "/full/or/relative/path/to/development/my-package"
    }
],
"require": {
    "my-package": "*"
}

您必须在包src内定义包composer.json目录,而不是在Laravels自己的composer.json内。在包'composer.json

中尝试并像这样定义它
"require" : {
    "twbs/bootstrap": "dev-master",
    "laravelcollective/html": "5.3.*"
},
"autoload" : {
    "psr-4" : {
        "PackageNamespace\\PackageClass\\" : "src/"
    }
},

<强>更新

为了进行正确的包开发,您必须将包文件保存在/vendor/ composer目录以外的某个目录中。主要原因是,如果可能存在冲突问题,或者在composer /vendor路径下清理和设置所有内容,开发人员可以删除整个/vendor目录。我使用一种非常简单的方法,并将自己的包保存在:

<application>/dev/packages/<package-namespace>/<package-name>

你必须在你的包中初始化一个git,以便composer能够识别存储库。要创建一个git包,请转到您的包位置并运行以下命令:

cd <application>/dev/packages/<package-namespace>/<package-name>
git init
git add *
git commit -m "Initial commit"

您可能还需要在提交前设置git config user.namegit config user.email,以便git能够识别某人并允许本地提交:

git config user.email "you@example.com"
git config user.name "Your Name"

在我的示例中,命名空间为lytr,包名称为testpkg

<application>/dev/packages/<package-namespace>/<package-name>/composer.json<application>/dev/packages/lytr/testpkg)将如下所示:

{
    "name" : "lytr/testpkg",
    "description" : "Test package of Lytr",
    "keywords" : [
        "test",
        "package"
    ],
    "license" : "MIT",
    "require" : {
        "twbs/bootstrap" : "dev-master",
        "laravelcollective/html" : "5.3.*"
    },
    "autoload" : {
        "psr-0" : {
            "Lytr\\TestPkg\\" : "src"
        }
    },
    "extra" : {
        "branch-alias" : {
            "dev-master" : "1.0-dev"
        }
    },
    "minimum-stability" : "dev"
}

然后在您的应用程序<application>/composer.json,您将拥有一个本地git存储库,您的软件包就像这样:

"repositories": [
    {
        "type": "path",
        "url": "<full-application-path>/dev/packages/lytr/testpkg"
    }
],
"require" : {
    "lytr/testpkg": "*"
},
"minimum-stability": "dev",

我包含"minimum-stability": "dev",,因为我们使用的是master-dev版本。然后在运行composer update命令 后,在程序包要求中具有"twbs/bootstrap" : "dev-master",,我们将在控制台窗口中看到以下输出:

Composer update

在我们更改包composer.json并需要"laravelcollective/html" : "5.3.*",之后,我们执行了composer update,我们看到composer正确安装了laravelcollective/html包:

Composer update

我知道这可能看起来令人困惑,而且有点过分,但这是开发编写器包的正确方法。您还可以将您的包放在git存储库中,并使composer克隆该存储库而不是本地文件。当你完成开发包并在https://packagist.org/下发布它之后,你将只需要你的包作为任何其他普通包而没有存储库和所有本地git的东西。请记住,您处于开发阶段而非生产阶段。