60

我正在寻找用 PHP 开发一个包,但我不希望它立即在 GitHub 或其他地方可用。在我的 中包含一个 Packagist 文件很容易composer.json,但是如何将本地包添加到我的中composer.json?另外,我应该在/vendor/foo/bar(相对于 root composer.json)中构建包,还是应该把它放在其他地方?

编辑:我想我的问题是关于其他人如何编写他们的包。是否每个新包都被添加到 Packagist,然后当你想测试你的更改时,你提交到 GitHub(或任何地方),然后通过 Composer 将其拉回?这似乎真的很低效。

4

8 回答 8

26

由于这个问题有许多不同的组件/标准需要解释,我会在这里尽可能多地解释,你可以PM我或者只是谷歌它来寻找更具体的问题。

要回答您的第一个问题,“如何将本地包添加到我的composer.json?”中:

如果“添加本地包”是指自动加载类/包,则可以通过使用 PSR-4 或 PSR-0 或 Composer 中的 Classmap 选项来实现。

阅读更多

如果您需要有关 PSR-0、PSR-4 和 Classmap 的更多信息,可以使用 Google 搜索。

例子

"autoload": {
   "psr-4": { "Core\\": "src/Core" }  ## "standard": { "namespace" : "path/to/dir"}
}

或者(编辑)

如果你真的想添加一个本地包:

  1. 为本地包创建一个composer.json,例如:

    {
       "name": "localPackage/core",
       "version": "dev-master"
    }
    

    您还可以根据需要指定其他属性和/或依赖项。

  2. 压缩包,将composer.json文件作为 . 中的根文件archive.zip,并将其放置在需要的位置。

  3. 在要包含本地包的其他项目/包中,将本地包名称添加到所需参数,例如

    "localPackage/core": "dev-master"
    

    在参数下添加以下内容repositories

    "repositories" : [
        {
            "type": "artifact",
            "url": "path/to/localPackage.zip"
        }
    ]
    

现在如果你在 git 上有本地包,那么就不需要存档包(基本上省略步骤 2),你只需要将上面示例中的 URL 替换为path/to/localPackage/.git.

(编辑结束)


现在回答更大的问题:“我如何开发和包含 Composer 包?”:

  1. 决定目录结构。通常情况如下:

    /PackageRoot
        /src/PackageCore
        composer.json   ## this is your library’s composer.json
        LICENSE
    

    并设置您的composer.json.

    我的一个文件的示例composer.json可以在http://pastebin.com/tyHT01Xg找到。

  2. 上传到Github标记版本。使用语义版本控制(确保vendor在上传到 Github 时排除/忽略目录)。

  3. 使用Packagist注册包(登录后)。

    如果您已将提交标记为v1.0.0(或类似),那么这将显示在该包的 Packagist 仪表板中。

现在,如果一切都正确,您应该能够通过将您的库添加到该项目中来将其用作其他项目中的依赖composer.json项。

于 2014-09-28T08:07:56.087 回答
26

您可以告诉 composer 使用任何本地路径,而不是创建新的存储库:

https://getcomposer.org/doc/05-repositories.md#path

例如,假设您的 PHP 项目位于~/devel/projects

你可能有你的主要项目~/devel/projects/main_project,你的“本地包”在~/devel/projects/local_package

为本地包定义您的作曲家配置。在~/devel/projects/local_package/composer.json.

{
    "name": "your_vendor_id/your_local_package",
    ...
}

然后,您可以~/devel/projects/main_project/composer.json通过路径 repo 编辑并链接到您的本地包:

"repositories": [
    {
        "type": "path",
        "url": "../local_package",
        "options": {
            "symlink": true
        }
    }
],
"require": {
    "your_vendor_id/your_local_package": "dev-master",
    ...
}

有关此链接的更多信息(不是我写的,但对此主题有很好的解释):

https://carlosbuenosvinos.com/working-at-the-same-time-in-a-project-and-its-dependencies-composer-and-path-type-repository/

于 2016-08-01T11:46:30.453 回答
9

似乎这个线程上的大多数答案都不是“知道的”。我自己是 Composer 的新手,但这些答案具有误导性。这个问题可以简单地表述为:“我怎样才能开发一个作曲家包”。

是的,您可以使用自定义存储库或上传未完成的包并在每次更改后更新它。这既不是正确的解决方案,也不是问题的答案。

Composer 的官方文档没有预先说明这一点并没有帮助,但是您可以在Libraries 文档页面上看到标题:

每个项目都是一个包

理解这一点非常重要

作曲家.json:

前面提到的页面继续说明:

为了使该软件包可安装,您需要为其命名。您可以通过在composer.json

{
    "name": "acme/hello-world",
    "require": {
        "monolog/monolog": "1.0.*"
    }
}

到目前为止,在这个示例中,我们有一个必需的包,现在还有一个名称。注意vendor/name格式。

所以现在自动加载我们自己的文件,这些文件记录在基本使用页面上。

{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}

这将自动加载目录下的命名空间类文件src/Acme

继续玩乐。

安装更新

使用以下命令安装或更新软件包:

composer update

或者

php composer.phar update

这将下载所需的包并创建 autoload.php 文件

我们的项目结构应该类似于以下内容:

src
    Acme
        Foo.php
vendor
    monolog
        ...
composer.json

包含

现在来测试。

包括 autoload.php

require_once 'path/to/project/vendor/autoload.php';

假设 Foo.php 如下所示:

<?php

namespace Acme;

class Foo {
    public static function bar(){
        return 'baz';
    }
}

?>

然后我们可以从我们的脚本中调用它:

echo Acme\Foo::bar(); // baz

请更正我可能陈述的任何误导性信息。这似乎是一个流行问题的解决方案。

于 2015-09-25T00:03:52.697 回答
8

这是解决方案的概述以及我自己的

  1. 在包装师上发布

由于您还不想发布,因此您正在开发中,这是一个糟糕的选择。

  1. 上传github

您可能不想在 github 上发布您的库源,不想为私人回购付费,或者能够使用云外部服务(由于政治或网络政策)。

  1. 压缩你的图书馆

您可以在示例实现中使用 composer 存储库路径来指向本地 zip 文件作为发布。每次对库进行更改时都必须重新压缩,即使使用批处理文件来完成,这也很恶心。

  1. 上传到您机器上的本地 git/svn 存储库

这已经接近了,但是每次更改库并想要测试示例实现时,您都需要进行作曲家更新。这模仿了制作,但很麻烦。我个人推荐这个解决方案,即使它不是无脑的。

  1. 直接自动加载库(sortof 做你想要的)

这是一个 hack,但您可以添加:

{    
  "require": {
  },
  "autoload": {
    "psr-4": { 
      "yourlibnamespace": "D:\\Code\\yourlib\\src\\" 
    }
  }

}

请注意,您需要将 lib 中的“require”部分复制并粘贴到您的示例实现中。将“yourlibnamespace”更改为您的库名称空间,将“D:\Code\yourlib\src\”更改为您的库源的本地路径。

这样,任何更改都会立即反映出来。但是,您根本不会使用或测试库的 composer.json 文件。如果您更改库 .json 中的要求,它根本不会通过。所以它有一些很大的缺点,但确实可以做你想做的事,那就是用尽可能少的命令立即测试你的库实现。

  1. 直接在库树中添加示例实现(推荐)

通常您只有 src\ 和 tests\,但很多都有示例\,您可以在其中找到示例实现。在开发应用程序时,您可以为这些示例实现做出贡献。您可以在本地 git/svn 存储库中执行此操作,并且您可以自动获取 lib 的“require”以及命名空间。这是世界上最好的。我推荐这种方法。

于 2015-04-28T21:43:40.843 回答
5

也许添加自定义存储库会对您有所帮助?

https://github.com/composer/composer/blob/master/doc/05-repositories.md

您可以非常轻松地使用您的库设置本地 git 存储库。

当然,如果您使用 composer 来管理依赖项,您应该在其他地方构建您的库并通过 composer 将其下载到供应商/因为这是我想的重点。

于 2013-01-12T17:36:46.890 回答
5

为了提高开发效率,我只需将开发存储库符号链接到已经安装它的目录中。

例如,如果/Code/project-1需要一个位于 中的包/Code/package-1,我:

  1. 提交package-1到 GitHub(甚至可以是私有的)。
  2. 然后我告诉project-1使用自定义存储库安装它(有关存储库配置的链接,请参阅其他答案)。
  3. 安装后,我符号链接/Code/project-1/vendor/developer/package-1/Code/package-1.

这样,当我在 中进行更改时/Code/package-1,它会立即反映在/Code/project-1.

于 2015-01-14T18:15:17.253 回答
5

这就是我在本地创建和开发新 Composer 包的流程:

  1. 在 GitHub 上为包创建一个新的存储库(只是一个示例)
  2. 将其添加到 Composer 的数据库 (packagist.org)
  3. 通过 composer require 将其添加到您的主项目中。这是您开始想知道如何快速应用修补程序的地方
  4. 将它克隆到本地机器上的某个地方,这是你开发它的地方
  5. 现在要测试您的本地版本,添加一个 php require() 语句,您可以在其中加载有问题的类文件。自动加载器不会加载通过作曲家下载的,而是您本地的。
  6. 完成修补程序后,删除/注释掉 require 语句以恢复使用包的 composer 版本。
  7. 提交所有更改,标记提交并推送到 GitHub;hook 触发更新 Composer。在你的主项目上运行 composer update,包会更新到你的本地版本。

这仍然不理想,但它可以完成中小型封装的工作。

于 2016-03-15T14:04:46.273 回答
0

我的工作流程没有完全回答 OP 的问题,但可能对其他人有帮助。

  1. 我喜欢在现实世界的项目中开发一个可重用的包/库,我不想在本地通过 git/composer。
  2. 与生产相比,我也不喜欢在本地以不同的方式加载包(例如,通过本地要求语句或本地作曲家设置)。

所以我做的很简单:我直接在供应商目录下添加包,直接或使用符号链接。

缺点

  1. 使用 composer update / install 时,您的包可能会被覆盖。(因此我倾向于在此期间一一更新或添加依赖项)。
  2. 如果不小心,生产环境上的 composer install 可能会安装不同的版本。所以继续推送你的包和版本标签!!
  3. 通过 composer update 更改包的依赖项并将其加载到父项目中,覆盖包的文件夹
于 2018-05-17T14:33:26.660 回答