如何开发和包含Composer包?

gre*_*ert 53 php composer-php

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

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

Sha*_*Sam 26

由于这个问题有许多不同的组件/标准需要解释,我会尽量在这里解释一下,你可以告诉我或者谷歌它可以提出更具体的问题.

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

如果通过"添加本地包"表示自动加载您的类/包,则可以通过在composer中使用PSR-4或PSR-0或Classmap选项来实现.

阅读更多

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

"autoload": {
   "psr-4": { "Core\\": "src/Core" }  ## "standard": { "namespace" : "path/to/dir"}
}
Run Code Online (Sandbox Code Playgroud)

或(编辑)

如果您确实想要添加本地包:

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

    {
       "name": "localPackage/core",
       "version": "dev-master"
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    "localPackage/core": "dev-master"
    
    Run Code Online (Sandbox Code Playgroud)

    repositories参数下添加以下内容:

    "repositories" : [
        {
            "type": "artifact",
            "url": "path/to/localPackage.zip"
        }
    ]
    
    Run Code Online (Sandbox Code Playgroud)

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

(编辑完结)


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

  1. 确定目录结构.通常如下:

    /PackageRoot
        /src/PackageCore
        composer.json   ## this is your library’s composer.json
        LICENSE
    
    Run Code Online (Sandbox Code Playgroud)

    并设置你的composer.json.

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

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

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

    如果您已将提交标记为v1.0.0(或类似),则此信息将显示在您的Packagist信息中心中.

现在,如果一切正常,您应该能够将您的库作为其他项目中的依赖项,方法是将其添加到该composer.json项目中.

  • 但是如何开发一个没有*需要发布它的作曲家包*?原因是我不想发布我的包,因为它基本上还没有完成,但我仍然想要定义我的composer.json文件和它的依赖*没有*需要实际*commit*和/或*发布*它已经在某个地方.我希望能够修改我的代码,直到它好**当它准备就绪时我想发布它.示例:我有一个项目A,对于这个项目,我在我的新软件包B上定义了一个*require*依赖项,它只存在于我的机器上.如何*在A中测试*B而不发布? (10认同)

Fed*_*ero 20

您可以告诉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",
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

"repositories": [
    {
        "type": "path",
        "url": "../local_package",
        "options": {
            "symlink": true
        }
    }
],
"require": {
    "your_vendor_id/your_local_package": "dev-master",
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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


iau*_*ion 9

似乎这个帖子上的大多数答案都不是"知情".我自己是Composer的新手,但这些答案都是误导性的.问题可以简单地说:"我如何开发作曲家包".

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

它没有帮助,作曲的官方文档没有说明这个前期,但你可以看到在标题图书馆文档页面:

每个项目都是一个包

这一点非常重要

composer.json:

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

为了使该软件包可安装,您需要为其命名.您可以通过添加name属性来完成此操作composer.json

{
    "name": "acme/hello-world",
    "require": {
        "monolog/monolog": "1.0.*"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

所以现在自动加载我们自己的文件,这在Basic使用页面上有记录.

{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谈到乐趣.

安装更新

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

composer update
Run Code Online (Sandbox Code Playgroud)

要么

php composer.phar update
Run Code Online (Sandbox Code Playgroud)

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

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

src
    Acme
        Foo.php
vendor
    monolog
        ...
composer.json
Run Code Online (Sandbox Code Playgroud)

包含

现在来测试一下.

包括autoload.php

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

假设Foo.php如下所示:

<?php

namespace Acme;

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

?>
Run Code Online (Sandbox Code Playgroud)

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

echo Acme\Foo::bar(); // baz
Run Code Online (Sandbox Code Playgroud)

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

  • 正如对原始问题的编辑所提到的,每次对子包进行一点更改时都必须提交、推送,然后在父项目上运行更新,效率确实很低。我不确定这个答案是否涉及该问题。 (2认同)

Fin*_*ton 7

这是对我自己的解决方案的回顾

  1. 在包装上发表

由于你还不想发布,你正在开发中,这是一个糟糕的选择.

  1. 上传github

您可能不希望在github上发布您的库源,不想支付私人仓库,或者能够使用云外部服务(由于政治或网络策略).

  1. 拉上你的图书馆

您可以使用示例实现中的composer存储库路径指向本地zip文件作为发行版.每次对lib进行更改时都需要重新压缩,即使使用批处理文件也是如此,这很icky.

  1. 上传到您计算机上的本地git/svn repo

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

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

这是一个黑客,但你可以添加:

{    
  "require": {
  },
  "autoload": {
    "psr-4": { 
      "yourlibnamespace": "D:\\Code\\yourlib\\src\\" 
    }
  }
Run Code Online (Sandbox Code Playgroud)

}

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

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

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

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


fsw*_*fsw 5

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

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

您可以非常轻松地在库中设置本地git存储库.

当然,如果您使用composer来管理依赖项,您应该在其他地方构建您的库并将其下载到vendor/via composer coz这是我猜的全部观点.

  • 因此,在开发过程中,每次对包进行微小更改时都必须执行`composer update`,以便开发项目引入最新版本?有更快的方法吗? (2认同)

小智 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.


Geo*_*gan 5

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

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

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