[fastadmin] 第四十六篇 FastAdmin 解决 Composer 权限问题 win11
背景
不管是 我手动加入了composer.json ,然后执行upate 报错 如下:
D:\work\phpstudy\youyi\yygang (master -> origin)
λcomposer update
Loading composer repositories with package information
Updating dependencies
Lock file operations: 13 installs, 16 updates, 0 removals
- Locking adbario/php-dot-notation (2.5.0)
- Locking alibabacloud/credentials (1.2.3)
- Locking alibabacloud/darabonba-openapi (0.2.15)
- Locking alibabacloud/dypnsapi-20170525 (1.2.0)
- Locking alibabacloud/endpoint-util (0.1.1)
- Locking alibabacloud/gateway-spi (1.0.0)
- Locking alibabacloud/openapi-util (0.2.1)
- Locking alibabacloud/tea (3.2.1)
- Locking alibabacloud/tea-console (0.1.3)
- Locking alibabacloud/tea-utils (0.2.21)
- Locking alibabacloud/tea-xml (0.2.4)
- Upgrading cache/adapter-common (1.2.0 => 1.3.0)
- Upgrading cache/filesystem-adapter (1.1.0 => 1.2.0)
- Locking composer/pcre (3.3.2)
- Upgrading ezyang/htmlpurifier (v4.17.0 => v4.18.0)
- Upgrading league/mime-type-detection (1.12.0 => 1.15.0)
- Locking lizhichao/one-sm (1.10)
- Upgrading maennchen/zipstream-php (2.1.0 => 2.2.6)
- Upgrading monolog/monolog (2.9.3 => 2.10.0)
- Upgrading phpoffice/phpspreadsheet (1.25.2 => 1.29.10)
- Upgrading psr/container (2.0.1 => 2.0.2)
- Downgrading psr/http-factory (1.1.0 => 1.0.2)
- Upgrading symfony/cache-contracts (v2.5.3 => v2.5.4)
- Upgrading symfony/deprecation-contracts (v2.5.3 => v2.5.4)
- Upgrading symfony/finder (v5.4.43 => v5.4.45)
- Upgrading symfony/mime (v5.4.43 => v5.4.45)
- Upgrading topthink/framework (dev-master c859e71 => dev-master a1a4c85)
- Upgrading workerman/gateway-worker (v3.1.17 => v3.1.18)
- Upgrading workerman/workerman (v4.1.16 => v4.1.17)
In JsonFile.php line 184:
file_put_contents(./composer.lock): failed to open stream: Permission denied
update [--with WITH] [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--dry-run] [--dev] [--no-dev] [--lock] [--no-install] [--no-audit] [--audit-format AUDIT-FORMAT] [--no-autoloader] [--no-suggest] [--no-progress] [-w|--with-dependencies] [-W|--with-all-dependencies] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--apcu-autoloader-prefix APCU-AUTOLOADER-PREFIX] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [-m|--minimal-changes] [-i|--interactive] [--root-reqs] [--] [<packages>...]
还是直接 composer require也是无权限
解决 Composer 权限问题
这是典型的文件权限问题。让我们逐步解决:
方法一:以管理员身份运行(推荐)
Windows 解决方案:
- 关闭当前命令行窗口
- 右键点击”命令提示符”或”PowerShell”
- 选择”以管理员身份运行”
- 切换到项目目录
- 重新执行 composer update
cd D:\work\phpstudy\youyi\yygang
composer update
方法二:修改文件权限
检查并修改文件权限:
# 检查 composer.lock 文件属性
dir composer.lock /Q
# 如果文件存在但只读,移除只读属性
attrib -R composer.lock
# 然后重新执行
composer update
方法三:删除 composer.lock 后重新安装
# 删除 composer.lock 文件
del composer.lock
# 删除 vendor 目录(如果存在权限问题)
rmdir /s vendor
# 重新安装
composer install
方法四:使用 –no-scripts 参数
composer update --no-scripts
方法五:检查磁盘空间和杀毒软件
- 检查磁盘空间是否充足
- 临时关闭杀毒软件
- 检查是否有其他程序占用文件
临时解决方案(如果上述方法都不行)
如果权限问题一直无法解决,我们可以手动下载依赖包:
1. 创建手动安装脚本
创建 manual_install_aliyun.php
:
<?php
// 手动安装阿里云 SDK 的简化版本
class ManualAliyunInstaller
{
public function install()
{
$vendorDir = __DIR__ . '/vendor';
// 创建必要的目录结构
$this->createDirectories($vendorDir);
// 下载并创建必要的类文件
$this->createCredentialClass($vendorDir);
$this->createConfigClass($vendorDir);
$this->createSmsClasses($vendorDir);
echo "手动安装完成!\n";
}
private function createDirectories($vendorDir)
{
$dirs = [
$vendorDir . '/alibabacloud/credentials/src',
$vendorDir . '/alibabacloud/darabonba-openapi/src/Models',
$vendorDir . '/alibabacloud/dypnsapi-20170525/src/Models',
$vendorDir . '/alibabacloud/tea-utils/src',
];
foreach ($dirs as $dir) {
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
}
}
private function createCredentialClass($vendorDir)
{
$content = '<?php
namespace AlibabaCloud\Credentials;
class Credential
{
private $accessKeyId;
private $accessKeySecret;
public function __construct($config = [])
{
$this->accessKeyId = $config["accessKeyId"] ?? "";
$this->accessKeySecret = $config["accessKeySecret"] ?? "";
}
public function getAccessKeyId()
{
return $this->accessKeyId;
}
public function getAccessKeySecret()
{
return $this->accessKeySecret;
}
}';
file_put_contents($vendorDir . '/alibabacloud/credentials/src/Credential.php', $content);
}
private function createConfigClass($vendorDir)
{
$content = '<?php
namespace Darabonba\OpenApi\Models;
class Config
{
public $credential;
public $endpoint;
public function __construct($config = [])
{
if (isset($config["credential"])) {
$this->credential = $config["credential"];
}
}
}';
file_put_contents($vendorDir . '/alibabacloud/darabonba-openapi/src/Models/Config.php', $content);
}
private function createSmsClasses($vendorDir)
{
// 创建简化的 SMS 相关类
// 这里只是示例,实际使用需要完整的 SDK
echo "SMS 类创建完成\n";
}
}
// 运行安装
$installer = new ManualAliyunInstaller();
$installer->install();
2. 创建简化的阿里云短信类
如果手动安装太复杂,我们可以直接使用 HTTP 请求的方式:
<?php
namespace app\common\library;
class AliyunSmsSimple
{
private $accessKeyId;
private $accessKeySecret;
private $signName;
private $templateCode;
public function __construct()
{
$this->accessKeyId = config('site.aliyun_access_key_id');
$this->accessKeySecret = config('site.aliyun_access_key_secret');
$this->signName = config('site.aliyun_sms_sign_name');
$this->templateCode = config('site.aliyun_sms_template_code');
}
/**
* 使用 HTTP 请求发送短信
*/
public function sendVerifyCode($mobile, $code)
{
$params = [
'CountryCode' => '86',
'PhoneNumber' => $mobile,
'SignName' => $this->signName,
'TemplateCode' => $this->templateCode,
'TemplateParam' => json_encode(['code' => $code, 'min' => 10]),
'CodeLength' => strlen($code),
'ValidTime' => 10,
'DuplicatePolicy' => 1,
'CodeType' => 1,
'ReturnVerifyCode' => false
];
$result = $this->request('POST', 'https://dypnsapi.aliyuncs.com/', $params, 'SendSmsVerifyCode');
if ($result && isset($result['Code']) && $result['Code'] === 'OK') {
return [
'code' => 1,
'msg' => '短信发送成功',
'data' => []
];
} else {
return [
'code' => 0,
'msg' => '短信发送失败:' . ($result['Message'] ?? '未知错误'),
'data' => []
];
}
}
private function request($method, $url, $params, $action)
{
// 这里需要实现阿里云的签名算法
// 由于比较复杂,建议还是解决 Composer 权限问题
return ['Code' => 'OK', 'Message' => 'Success'];
}
}
最佳解决方案
强烈建议使用方法一:以管理员身份运行命令行,这是最简单有效的解决方案。
具体步骤:
- 按
Win + R
- 输入
cmd
- 按
Ctrl + Shift + Enter
(以管理员身份运行) - 切换到项目目录:
cd D:\work\phpstudy\youyi\yygang
- 执行:
composer update
如果仍然有权限问题,请检查:
- 杀毒软件是否阻止了文件写入
- 磁盘是否有足够空间
- 项目文件夹是否在受保护的系统目录中
本次操作 在使用 方案二 成功搞定
方法二:修改文件权限
检查并修改文件权限:
# 检查 composer.lock 文件属性
dir composer.lock /Q
# 如果文件存在但只读,移除只读属性
attrib -R composer.lock
# 然后重新执行
composer update
搞定收工
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: