我目前正在尝试写我的第一个作曲家包,但我似乎无法使它正常工作。我得到的只有:运行以下代码时的Class 'Craftsman\EzServer' not found:
<?php
require_once __DIR__ . "/vendor/autoload.php";
echo Craftsman\EzServer::Hello();经过一个广泛的搜索(从字面上说是一百个网站和指南),我只能通过在我尝试使用我的包的任何项目中手动添加一个classmap来让它工作。
这是我的项目的composer.json
{
"repositories": [
{
"type": "package",
"package": {
"name": "finlaydag33k/craftsman",
"version": "dev-master",
"type": "library",
"source": {
"url": "https://gitlab.com/FinlayDaG33k/craftsman.git",
"type": "git",
"reference": "master"
}
}
}
],
"require":{
"predis/predis": "dev-master",
"finlaydag33k/craftsman": "dev-master"
}
}和包裹的composer.json
{
"name": "finlaydag33k/craftsman",
"description": "",
"type": "library",
"license": "FinlayDaG33k License",
"authors": [
{
"name": "Aroop 'FinlayDaG33k' Roelofs",
"email": "me@finlaydag33k.nl"
}
],
"minimum-stability": "dev",
"require": {
"php": ">=7.0.0"
},
"autoload":{
"psr-4":{
"Craftsman\\": "src/"
}
}
}这是我的供应商dir的树:
vendor
|-finlaydag33k
|-craftsman
|-src
|-EzServer.php最后但同样重要的是,我的EzServer.php
<?php
namespace Craftsman;
class EzServer {
public function Hello(){
return "World!";
}
}它正确地从Git下载,所以这似乎不是一个问题。
我运行了composer dump-autoload几百次,同时尝试尝试各种东西(更改大小写,添加斜杠,删除斜杠,更改命名空间,在不同的文件夹中移动文件等等)。所以这也不应该是个问题。
我做错了什么?
发布于 2018-04-23 20:10:29
第一件事立即进入我的视线:您正在为您的库使用package定义。
如果你能避免,就不要这样做。如果这样做,就告诉Composer不要在目标目录中查找composer.json,并且必须再次提供该文件的所有信息,包括自动加载部分。
Composer可以非常容易地处理存储库本身。只需使用这种集成:
"repositories": [
{
"type": "vcs",
"url": "https://gitlab.com/FinlayDaG33k/craftsman.git"
}
]这将允许Composer访问该存储库的composer.json,并使用其中提供的所有信息:包名、其他必需的包和自动加载定义。(提示:存储库名称和URL根本不定义Composer包的任何部分- Composer包名称仅由composer.json文件中的composer.json属性定义,因此Composer将在repo中的所有分支和标记中查找该文件,然后查看回购包含包“finlaydag33k/ that”的可能版本)。
关于自动加载的另一个词,基于我的comment:autoloading有几个步骤可能由于大小写不一致的名称而失败。如果您的代码使用了一个名为Ezserver的类,这个类以前没有加载过,那么自动加载程序将使用这个拼写并尝试找到匹配的文件。如果文件名为EzServer.php,并且您使用的是区分大小写的文件系统(例如Linux、MacOS),则PHP将找不到该文件。如果您使用的是不区分大小写的文件(例如Windows),PHP将找到该文件。但是,一旦您将代码部署到区分大小写的环境,它就会失败。
还请注意,PHP将处理类名大小写不敏感。因此,如果您的代码首先使用拼写EzServer (自动加载将成功),而第二次使用Ezserver时,it将不会第二次失败。类已经加载。
因此,PHP类名的不区分大小写的内部处理与使用代码、类名和搜索区分大小写的文件系统的自动标注相结合,是细微的自动加载失败的来源。
如果您可以通过使用类映射自动加载程序来修复这个问题,就会发现类似这样的问题正在起作用。这将适用于任何可能区分大小写的拼写错误,但如果可以避免,则不建议使用。
https://stackoverflow.com/questions/49981591
复制相似问题