【问题标题】:Laravel 5.3 Composer is not updating package dependenciesLaravel 5.3 Composer 不更新包依赖项
【发布时间】:2019-03-09 15:48:41
【问题描述】:

我正在开发我的第一个软件包。该软件包正在运行。

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

因此我将它添加到包的 composer 文件中:

(这个 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"
    }
},
...

当我做 composer update 时,包的依赖项不会更新。我在这里错过了什么?

【问题讨论】:

  • 在这里打印composer update 输出?
  • 还有,vendor文件夹的内容?

标签: php composer-php laravel-5.3


【解决方案1】:

如果你的包还没有上传到packagist.org,你必须定义一个本地作曲家存储库。在 Laravel 的应用程序 composer.json 中添加一个本地存储库,如下所示:

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

您必须在包composer.json 中定义包src 目录,而不是在Laravel 自己的composer.json 中。尝试在包的composer.json 中这样定义它:

"require" : {
    "twbs/bootstrap": "dev-master",
    "laravelcollective/html": "5.3.*"
},
"autoload" : {
    "psr-4" : {
        "PackageNamespace\\PackageClass\\" : "src/"
    }
},

更新

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

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

您必须在您的包中初始化一个 git,以便作曲家识别存储库。要制作 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

&lt;application&gt;/dev/packages/&lt;package-namespace&gt;/&lt;package-name&gt;/composer.json (&lt;application&gt;/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"
}

然后在您的应用程序&lt;application&gt;/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.json 并要求"laravelcollective/html" : "5.3.*", 之后,我们执行composer update 并且我们看到composer 正确安装了laravelcollective/html 包:

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

【讨论】:

  • 我是否理解正确,这会将我自己的包从本地路径安装到我的 Laravel 应用程序中?如果是这样,我不想这样做,因为我仍在开发包。我想要的是包含包依赖项。
  • @klaaz 那么,您的包文件在哪里?在某个 git 存储库或 packagist.org 或您的本地计算机上?
  • @klaaz 这正是您在开发包时所需要的,拥有一个本地包存储库,进行更改添加新功能并使其按您想要的方式工作。当你完成你的包后,你将它上传到packagist.org 并且你需要它在应用程序composer.json 中,就像任何其他普通包一样。请参阅我的更新答案以了解正确的包开发方法。
猜你喜欢
  • 2014-04-21
  • 2020-10-31
  • 2016-06-20
  • 2017-11-10
  • 2019-06-12
  • 2016-05-29
  • 2017-10-31
  • 2017-06-28
  • 2015-12-10
相关资源
最近更新 更多