可以交付,但要把“交付物”从服务器上的运行状态,改成可验证的代码与配置包。前提是客户只保留域名解析、服务器和数据库的最高权限,同时愿意在约定窗口内配合执行你给出的命令或上传动作。若客户连测试环境、临时数据库或预览入口都不提供,交付就无法闭环,只能改为源码加说明书的离线移交。
不给生产权限通常有两种含义。第一种是客户不给生产服务器的登录权,但愿意提供一台独立测试机或容器环境,让你部署、联调、跑验收。第二种是客户连测试环境也不给,只允许你在本地或自己的沙箱里完成构建,最后把产物交出去。
第一种情况下,交付仍然可以是“可运行系统”。你需要客户提供测试环境的访问方式、数据库连接信息、对象存储或CDN的测试桶,以及一个能触发构建和部署的账号。验收通过后,由客户自己把同一份构建产物发布到生产,你只提供发布步骤和回滚步骤。
第二种情况下,交付只能降级为“可复现的构建包”。这时必须把环境依赖写清楚:运行时版本、扩展模块、环境变量名、目录权限、定时任务、队列消费者、反向代理规则。任何只存在于你本机、没有写进配置文件的设置,都会在客户生产环境变成故障点。
没有生产权限时,最容易出问题的是验收标准仍然写着“首页能打开”“后台能登录”。这类标准依赖生产环境,客户不给你权限,就无法由你亲自确认。可执行的做法是把验收拆成三层。
如果客户连测试环境都不提供,行为层验收就只能由客户自己执行。你交付一份带编号的检查清单,客户逐条勾选并回传结果。你根据回传结果决定下一步:全部通过则进入发布;有失败项则先判断是配置差异还是代码缺陷,再决定修代码还是补说明。
假设客户只给一个压缩包上传入口,既不给测试环境,也不允许你查看任何运行日志。你按本地环境构建并交付,客户上传后页面白屏。此时你无法判断是构建产物不完整、环境变量缺失、还是服务器缺少某个扩展。你能做的只有反复让客户截图或复制报错,交付周期会被拉长,而且责任边界模糊。
更麻烦的是,如果客户的生产环境和你本地存在数据库版本、字符集或文件权限差异,而这些差异没有在交付前被识别,那么“本地通过”就不能作为生产可用的证据。这种情况下,正确的动作不是继续盲改代码,而是先要求客户提供一个最小可观测入口:哪怕只是错误日志文件、一个临时测试域名,或一次屏幕共享。若客户始终不提供,你应当在交付说明中明确写出未验证项,并把发布后的首次启动列为客户侧责任。
在正式移交前,安排一次干跑。具体动作是:你在一个干净目录里,只使用交付包和交付说明,从零执行安装、构建、启动。整个过程不依赖你本机的缓存、全局安装的包或未记录的配置文件。
干跑的结果直接决定下一步。如果干跑成功,说明交付包具备可复现性,可以进入客户侧发布,你提供发布命令和回滚命令。如果干跑失败,说明还有隐藏依赖没有写进说明,先补齐再移交,不要跳过。如果客户不参与干跑也不提供任何环境,那么你能承诺的只是“源码与构建产物已移交”,无法承诺生产可用;后续任何启动问题都需要客户先提供可观测条件,才能继续排查。