源码交付清单:做完一个项目,你到底该从开发商手里拿到什么

文章来源声明: 原文作者:用户78847731634; 来源站点:掘金; 原文链接:https://juejin.cn/post/7689415591786790938; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

清单可直接抄进合同附件,尤其适合甲方验收定制软件时逐项核对。价值在于把“能用”升级为“可维护、可追责”,避免被假源码和口头承诺拿捏。

源码交付清单:做完一个项目,你到底该从开发商手里拿到什么 ------------------------------
很多团队在验收软件时,只确认"能打开、能点",然后开发商甩过来一个 `setup.exe` 或一个小程序二维码,这事就算完了。但**exe / 二维码只是结果,真正决定你后续能不能改、能不能维护、出事能不能追责的,是它背后那一整套资产**。

我做了多年 .NET 桌面端,也接小程序和 APP,下面这份跨平台交付清单,建议收藏,验收时逐条对。

桌面端(WPF / WinForms)必交 6 样

  1. 可安装包 / 自包含发布目录(不是散落 dll);
  2. 完整源码(.csproj/.sln + 依赖清单);
  3. 数据库脚本(建表 / 初始数据 / 迁移);
  4. 配置与密钥(appsettings.json、串口参数、接口地址,密钥用占位符);
  5. 操作文档 + 部署文档;
  6. 授权 / 激活说明(按机器授权要把规则讲清)。

交付前必跑的自包含发布:

dotnet publish -c Release -r win-x64 --self-contained <span>true</span> `
  -p:PublishSingleFile=<span>true</span> -p:IncludeNativeLibrariesForSelfExtract=<span>true</span>

验收"缺件自检"小工具:

<span>static</span> <span>readonly</span> <span>string</span>[] Required = { <span>"src"</span>, <span>"db"</span>, <span>"doc"</span>, <span>"appsettings.json"</span> };
<span><span>public</span> <span>static</span> <span>void</span> <span>Check</span>(<span><span>string</span> root</span>)</span>
{
    <span>var</span> miss = Required.Where(r =>
        !Directory.Exists(Path.Combine(root, r)) &&
        !File.Exists(Path.Combine(root, r))).ToList();
    Console.WriteLine(miss.Any() ? <span>"缺:"</span> + <span>string</span>.Join(<span>","</span>, miss) : <span>"✅ 齐全"</span>);
}

小程序必交 6 样

  1. 前端源码(pages/、app.js、app.json,开发者工具能完整打开);
  2. 后端源码 + 部署说明(code2session、订阅消息、支付 v3 服务端);
  3. 已备案 HTTPS 域名(配进「服务器域名 → request 合法域名」);
  4. 管理员账号 + AppID(不移交,你永远是使用者);
  5. 微信支付商户号 + 证书(涉及支付时);
  6. 类目资质 + 小程序 ICP 备案。

后端换 openid 核心:

<span><span>public</span> <span>async</span> Task<<span>string</span>> <span>Code2OpenId</span>(<span><span>string</span> code</span>)</span>
{
    <span>var</span> url = <span>$"https://api.weixin.qq.com/sns/jscode2session"</span> +
              <span>$"?appid=<span>{AppId}</span>&secret=<span>{AppSecret}</span>&js_code=<span>{code}</span>&grant_type=authorization_code"</span>;
    <span>var</span> j = <span>await</span> _http.GetFromJsonAsync<JsonNode>(url);
    <span>return</span> j[<span>"openid"</span>]?.GetValue<<span>string</span>>();
}

  1. 完整源码(Android / iOS / MAUI / Flutter 工程);
  2. 签名密钥(Android keystore 丢了就无法更新,必须当面移交改密);
  3. 软著证书(国内商店上架强制);
  4. 应用商店开发者账号;
  5. 隐私政策 + SDK 清单(各商店强制);
  6. ICP / 公安备案。
android {
    signingConfigs {
        release {
            storeFile file("release.keystore")
            storePassword "******"   // 交接时务必改掉
            keyAlias "myapp"
            keyPassword "******"
        }
    }
    buildTypes { release { signingConfig signingConfigs.release } }
}

通用清单(直接抄)

类别桌面端小程序APP
产物安装包已发布小程序上架包
源码完整工程前端+后端工程+签名密钥
数据脚本表结构表结构
账号—管理员+AppID开发者账号
资质—类目+备案软著+备案+隐私
文档部署+操作部署+接口上架+隐私

怎么判断给的是真源码还是假源码

清单对了还要防"假源码"——能打开但编译不过、缺依赖、缺迁移脚本,等于没给。三个实招:

  1. 清环境重编译:在一台只装 SDK、没装第三方工具的干净机器上,源码 dotnet build / npm install && build 一遍,跑不通就是缺东西。
  2. 对照构建来源:让开发商提供 exe / 小程序的构建提交号(git commit / tag),你能从同一份源码构建出功能一致的结果,才叫源码对应成品。
  3. 抽查迁移脚本:新建空库跑他的建表 + 初始数据脚本,能还原出你正在用的数据结构,才算数据可延续。
<span>// 真源码的一个特征:版本号可从源码查到,对得上你拿到的 exe</span>
<span>var</span> v = System.Reflection.Assembly.GetExecutingAssembly()
            .GetName().Version.ToString();
Console.WriteLine(<span>"源码版本:"</span> + v);

几个常见套路

  • "源码涉及核心技术不能给"——买断定制开发的源码版权归甲方,这是合同范畴,不是技术范畴;
  • "你拿源码也看不懂"——看不懂可以找人接手,前提是你得有;
  • "先给 exe 用着,源码以后给"——以后往往就是没有以后。

把这份清单写进合同附件,比任何口头承诺都管用。

补充一句:源码交付和"开源"是两回事。你买断的是使用权 + 源码归属,不需要对方公开代码,但对方必须保证你能在自己手里重新构建、修改、找人接手。这一点写清楚,后续才不会被"核心技术"四个字拿捏。

验收与售后边界

验收以"清单逐项勾"为准,别口头"能用就行";售后写进合同:源码交付 ≠ 终身免费改,通常 1–3 个月免费 bug 修复,需求新增另算。

如果你是甲方、正在验收却只拿到一个 exe,或者手里有半成品想找人兜底,欢迎在评论区交流,或站内私信我帮你判断哪些东西本该是你的。关注我,后续聊更多"接单 / 交付 / 上架"的实踩经验。