【问题标题】:Using Composer locally then uploading files through FTP在本地使用 Composer 然后通过 FTP 上传文件
【发布时间】:2017-05-04 15:17:31
【问题描述】:

有点奇怪的设置,但遇到了一个项目,其中 Composer 已在本地环境中用于启动项目。最初的开发者没有对生产服务器的 ssh 访问权限,因此他在本地使用 Composer 并使用 FTP 将“供应商”目录从他的桌面上传到服务器。

我现在需要添加 PHPMailer 包,所以在我的 Mac 上本地完成了以下操作:

cd Desktop/
composer require phpmailer/phpmailer

这在我的桌面上创建了以下结构:

Desktop/composer.json
Desktop/composer.lock
Desktop/vendor/autoload.php
Desktop/vendor/composer/*
Desktop/vendor/phpmailer/*

我需要通过 FTP 上传哪些文件?我知道vendor/phpmailer/* 是我想要的包,所以需要上传。

其他人呢?我已经配置了一个自动加载器,所以这里不需要猜测vendor/autoload.php

composer.json我可以将包添加到已经存在的内容中,例如

"require": {
    *other packages here*
    "phpmailer/phpmailer": "^5.2"
}

但我不确定这是否有必要,因为我不会在服务器上使用 ssh/Composer 来运行任何更新?

【问题讨论】:

  • 这取决于 phpmailer 需要什么。尝试在composer中创建一个空项目并只需要phpmailer。就是看需要哪些包才能正常运行,只通过FTP客户端上传。
  • 您没有在vendor 中上传任何内容。你上传composer.lock到服务器,然后在服务器上运行composer install
  • @ceejayoz 重新阅读帖子 - 我们无权访问服务器来运行任何 composer 命令!
  • 只要将依赖添加到项目本地的composer.json文件和composer update即可。之后只需上传供应商文件。
  • 作为有同样问题的人,我想给一个提示:我使用 phpstorm 部署来上传和比较 /vendor 目录,这很痛苦,因为太慢了。更有效的是使用 Filezilla 上传整个 /vendor 目录

标签: php composer-php


【解决方案1】:

通常的工作流程是:

  1. 从版本控制中签出当前版本。
  2. 通过命令行添加依赖composer require new/package
  3. 这将下载新包并更新自动加载。
  4. 在本地或在测试网站环境中测试结果。
  5. 如果对结果满意,请将整个文件夹上传到生产服务器。

这个一般工作流程可能有几个例外:

ad 1:如果没有版本控制,您可能最好立即启动本地 git 存储库,并将当前生产状态作为第一次提交下载到其中。没有版本控制会让事情变得更难,尤其是回到已知的工作版本。由于生产服务器上的文件可能不受管理,您还需要将 vendor 文件夹签入新创建的版本控制,以避免取消对这些文件所做的任何更改。

ad 2:如果您知道自己在做什么,有时手动编辑 composer.json 文件是获得所需内容的更快方法,但您必须正确编辑 JSON。对我来说,如果我已经准备好命令行,通常太麻烦了。该命令还将选择适合已安装依赖项的匹配版本。手动编辑可能会导致您必须解决的版本冲突。请记住仅安装适用于生产环境中 PHP 版本的依赖项。您可能应该运行 composer config platform.php X.Y.Z 以便将 PHP 的生产版本添加到 composer.json 文件中,这会阻止 Composer 基于您的开发 PHP 安装依赖项版本。添加-g 开关会将此设置添加到您的全局(用户)设置中,这将影响您启动的所有作曲家操作,也适用于其他项目。

广告 3:手动编辑需要您在命令行上运行 composer update,因此可能没有理由不使用 composer require

ad 4:如何做到这一点完全取决于您必须使用的环境。

ad 5:在这个阶段,您已经组装了创建工作网站所需的所有文件。除非上传以某种方式失败,否则将它们上传到生产将始终导致网站正常工作。如果您担心 FTP 不可靠,您也可以使用一些“先上传到临时文件夹,然后在服务器上移动”的方法。有些人采取了不同的方法:他们在生产服务器上有一个 git 存储库,他们只是将应该上线的版本推送到该远程存储库。一些后推脚本将运行composer install。这种自动化方法也可以工作(但不使用 FTP),但在部署过程中出现故障的风险更高,并且可能没有简单的方法回到以前的情况。

所以最后我会说通过 FTP 上传整个文件夹结构(嗯,该协议本身是不安全的,最好用 FTPS(带 SSL 的 FTP)、SFTP 或 SCP 替换它)比运行 Composer 更好生产服务器。

您关于要上传哪些文件夹的具体问题:所有这些。特别是上传整个vendor 文件夹。它包含当前的自动加载器和软件需要的所有依赖包。如果您工作正常,您下载了现有的composer.jsoncomposer.lock 文件以及其他所有文件,并向其中添加了新的依赖项。这已更改这两个文件,将新包添加到 vendor 文件夹并将类添加到自动加载器。

不要只上传vendor 文件夹的一部分,或者手动编辑自动加载的组件。如果您在某些方面做错了,您只会给后面的开发人员带来惊喜,而且还需要更多时间。 Composer 是一个非常好的管理依赖项的工具 - 使用它!

【讨论】:

  • -1 建议在你的 git 中检查供应商。这根本没有必要。使用 satis 之类的工具或手动制作 tarball 来保存版本。将供应商包含到您的 git 中会使整个作曲家概念过时。
  • @JochenSchultz:我再次阅读了我的答案,但我没有看到我建议在哪里签入vendors。也许你可以为我指出这一点。
【解决方案2】:

您可以将 composer.json 从服务器复制到本地服务器,添加需求并运行 composer update。

之后,您可以将所有文件(composer.json、composer.lock 和 vendor 文件夹)复制到您的服务器...


或者你可以将本地的vendor/phpmailer复制到服务器的vendor文件夹中,在vendor/composer/autoload_psr4.php中搜索phpmailer的条目并将其添加到你的服务器vendor/composer/autoload_psr4.php中。

使用这个方法也可以同样的方式添加phpmailers依赖。

composer depends phpmailer/phpmailer

【讨论】:

  • -1 建议摆弄文件夹和自动加载,这根本不值得,但可能会引入错误和令人讨厌的惊喜。
  • 整个通过 ftp 上传供应商的事情是令人讨厌的......当我在我们的一个客户项目中遇到同样的问题时,我让他们设置了一个 satis 服务器并制作了一个 php 脚本来生成来自 composer.json 的 satis.json 自动。当然,不建议摆弄 vendor 文件夹中的文件。但是当谈到“客户:我需要这个脚本在 15 秒内运行”时,它可能会有所帮助。
  • 如果您阅读了 OP stackoverflow.com/questions/41224832/… 的评论,您就会明白这个问题是专门针对必须处理的情况量身定制的,而不是一般情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2011-02-17
  • 2010-12-24
  • 1970-01-01
  • 2012-09-18
相关资源
最近更新 更多