Composer,Laravel和本地包

时间:2014-03-19 14:54:47

标签: php laravel laravel-4 composer-php autoload

我的问题是我有一个不是存储库的软件包,我试图让它与Laravel和作曲家玩得很好。它仍然位于供应商文件夹下,唯一的问题是,如果我只是设置:

"psr-0": {
        "Test\\Test": "vendor/test/test/src/"
    }

这将加载服务提供商,但没有任何控制器等将自动加载。使用没有自己的存储库的larval实现包的正确方法是什么。或者这是否违背了包的性质,这应该只是在应用程序控制器下构建。

该软件包是由我使用工作台创建的,但我发现我并不真的需要将它作为一个单独的存储库,但将它作为一个软件包仍然是好的。因此,结构与常规包装完全相同:

vendor
    testvendor
        testpackage
            public
            src
            tests
            .gitignore
            composer.json
            phpunit.xml

更新:

作为我正在使用的解决方案:

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "vendor/package"
    ]
},

作为班级地图中的条目。期待我可能会将其重构到app文件夹中或为此包创建一个存储库。

3 个答案:

答案 0 :(得分:12)

如果您有一些类正在调用“package”,那么您不应该将这些文件添加到您的供应商文件夹中。此文件夹由作曲家管理,您可以随时松开它。在您的应用程序中创建一个子文件夹并将这些文件放在那里。

您必须确保PSR-0自动加载适用于文件夹结构中的每个文件。因此,如果您的根是vendor/test/test/src/而您的命名空间是

Test\\Test

您的所有文件都必须在

vendor/test/test/src/Test/Test/ClassFileName.php

PSR-4更容易处理和理解,这个

"psr-4": {
    "Test\\Test\\": "vendor/test/test/src/"
}

表示您的文件必须如下:

vendor/test/test/src/ClassFileName.php

仔细检查您的命名空间。使用带有PSR-0的命名空间时很容易出错并记住

composer dump-autoload

每次更改composer.json中的内容或创建新文件时都必须运行。如果它是一个简单的类自动加载,每次创建文件时,如果它是PSR-X自动加载,则每次在composer.json文件中创建或更新名称空间时。

如果您拥有的是一个真正的包,那么您应该使用Composer:当您的包被构造为一个composer包(以Laravel的composer.json为例)时,将它添加到您的应用程序的正确方法,如果它不是Packagist中的列表是repositories

您可以在公共VCS存储库中包含(非包装)包:

{
    "require": {
        "monolog/monolog": "dev-bugfix"
    },

    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/igorw/monolog"
        }
    ]
}

您可以在受密码的VCS存储库(git,bitbucket ...)中拥有(非包装)包:

{
    "require": {
        "vendor/my-private-repo": "dev-master"
    },
    "repositories": [
        {
            "type": "vcs",
            "url":  "git@bitbucket.org:vendor/my-private-repo.git"
        }
    ]
}

您可以将软件包压缩到硬盘中,然后通过artifact存储库类型加载它们:

"repositories": [
    {
        "type": "artifact",
        "url": "path/to/directory/with/zips/"
    }
],

答案 1 :(得分:2)

虽然@Antonio Carlos Ribeiro的答案非常好,但我在本地安装自定义软件包时遇到了问题(在答案的最后部分也有说明)

假设这是我们尝试安装的软件包的目录结构:

D:/test_pack
    src/
    composer.json

如果您不想将自定义程序包(很可能是您自己开发的)上传到在线存储库,则可以使用以下两种方法之一:

方法I

(您必须为您的软件包指定版本,否则您将收到此错误:在任何版本中都找不到请求的软件包,软件包名称中可能存在拼写错误。)

1)在composer.json中,添加版本到您的包。你的包装的json应该是这样的:

{
"name": "gandalf/test_pack",//This is your package's name
"description": "some desc",
"version": "1.0.0",//This is the version that you have to specify
"authors": [
    {
        "name": "gandalf the grey",
        "email": "fake@yahoo.com"
    }
],
"minimum-stability": "dev",
"require": {
    "laravel/framework": "~5.4"
},
"autoload": {
    "psr-4": {
        "Gandalf\\BotPack\\": "src/"
    }
} }

2)压缩你的包裹(让我们假设zip文件在D:/test_pack/test_packa.zip)

3)在laravel的composer.json中添加你的包名(在我们的例子中是gandalf / test_pack到json的require部分)并将存储库数组添加到composer.json文件中并在该数组中指定目录您的包的zip文件存在(在我们的例子中为D:/ test_pack)。像这样

{
    ...,
    "require": {//adding our package name to laravel's composer.json
        ...,
        "gandalf/test_pack": "*"//package's name
    },
    ...,

    "repositories": [
        {
            "type": "artifact",
            "url": "D:/test_pack"
        }
    ]
}

方法II (我最喜欢的方法,您必须使用git init然后git add .git commit -m "your message"

1)将包目录初始化为git目录,并将所有更改提交到本地存储库

(让我们说D:/test_pack是包含您的包(src/目录和composer.json)的目录。)

转到D:/test_pack目录并运行这些命令

git init
git add .
git commit -m "your message for this commit"

2)在您的包composer.json文件中添加最小稳定性

    {
        "name": "gandalf/test_pack",
        "description": "some desc",
        "authors": [
            {
                "name": "gandalf the grey",
                "email": "fake@yahoo.com"
            }
        ],
        "minimum-stability": "dev",//setting minimum-stability
        "require": {
               //dependencies that your package needs
        },
        "autoload": {
            "psr-4": {
                "Gandalf\\BotPack\\": "src/"
            }
        }
    }

3)在laravel的composer.json文件中需要" dev-master"你的包裹

{
    ...,
    "require": {
        ...,//some dependencies that laravel needs
        "gandalf/test_pack": "dev-master"//requiring dev-master from repository
    },

    "repositories": [
        {
            "type": "git",
            "url": "D:/test_pack"//path of the local repository directory which contains your package
        }
    ]
}

答案 2 :(得分:1)

对于任何Laravel项目,请加载本地包。它存储在您的计算机中。

在laravel的(项目)composer.json文件中添加

  "autoload": {
    "psr-4": {
      "YourPackage\\Namespace\\": "./local_Package_path/src"
    }
  },

并在Laravel Project目录中启动命令

composer dump-autoload

可选

如果您的项目中仍然没有软件包。然后 注册您的包裹的服务提供商。

要注册服务提供商,您只需要在config/app.php文件中向服务提供商数组添加一个条目即可。


'providers' => [

    /*
     * Laravel Framework Service Providers...
     */
    ...

    YourPackage\Namespace\PackageServiceProvider::class,
], 

现在希望您的软件包已成功加载到laravel项目中。