{"id":20270953,"url":"https://github.com/swiftdo/team-boke","last_synced_at":"2026-05-07T20:46:32.506Z","repository":{"id":74863605,"uuid":"421728723","full_name":"swiftdo/team-boke","owner":"swiftdo","description":"team-boke 后端 Api","archived":false,"fork":false,"pushed_at":"2022-01-08T09:33:25.000Z","size":1790,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":4,"default_branch":"dev","last_synced_at":"2025-02-27T04:52:01.888Z","etag":null,"topics":["flutter","vapor"],"latest_commit_sha":null,"homepage":"https://teamboke.herokuapp.com/","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/swiftdo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-10-27T08:02:28.000Z","updated_at":"2022-03-04T02:06:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"9d725d1a-7315-4e7f-9ee8-69d955ab3fbf","html_url":"https://github.com/swiftdo/team-boke","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fteam-boke","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fteam-boke/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fteam-boke/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fteam-boke/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/swiftdo","download_url":"https://codeload.github.com/swiftdo/team-boke/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241758954,"owners_count":20015249,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flutter","vapor"],"created_at":"2024-11-14T12:35:14.704Z","updated_at":"2026-05-07T20:46:27.472Z","avatar_url":"https://github.com/swiftdo.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Vapor实战项目\n\n\u003c!-- TOC --\u003e\n\n- [Vapor实战项目](#vapor%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE)\n- [项目模仿参考](#%E9%A1%B9%E7%9B%AE%E6%A8%A1%E4%BB%BF%E5%8F%82%E8%80%83)\n- [项目规划](#%E9%A1%B9%E7%9B%AE%E8%A7%84%E5%88%92)\n- [分支管理](#%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86)\n- [表设计](#%E8%A1%A8%E8%AE%BE%E8%AE%A1)\n- [自定义工作目录](#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95)\n- [路由](#%E8%B7%AF%E7%94%B1)\n- [数据库](#%E6%95%B0%E6%8D%AE%E5%BA%93)\n- [认证](#%E8%AE%A4%E8%AF%81)\n- [Heroku 部署](#heroku-%E9%83%A8%E7%BD%B2)\n    - [注册 Heroku 账户](#%E6%B3%A8%E5%86%8C-heroku-%E8%B4%A6%E6%88%B7)\n    - [通过 cli 方式进行 heroku 部署](#%E9%80%9A%E8%BF%87-cli-%E6%96%B9%E5%BC%8F%E8%BF%9B%E8%A1%8C-heroku-%E9%83%A8%E7%BD%B2)\n        - [安装 cli](#%E5%AE%89%E8%A3%85-cli)\n        - [登录](#%E7%99%BB%E5%BD%95)\n        - [创建一个应用程序](#%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F)\n        - [与 Heroku 连接](#%E4%B8%8E-heroku-%E8%BF%9E%E6%8E%A5)\n        - [设置 Buildpack](#%E8%AE%BE%E7%BD%AE-buildpack)\n        - [Swift 版本文件](#swift-%E7%89%88%E6%9C%AC%E6%96%87%E4%BB%B6)\n        - [Procfile](#procfile)\n        - [部署到 Heroku](#%E9%83%A8%E7%BD%B2%E5%88%B0-heroku)\n        - [Scale Up](#scale-up)\n        - [持续部署](#%E6%8C%81%E7%BB%AD%E9%83%A8%E7%BD%B2)\n    - [在 heroku 控制台进行部署](#%E5%9C%A8-heroku-%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BF%9B%E8%A1%8C%E9%83%A8%E7%BD%B2)\n    - [heroku 中 Postgres 的配置](#heroku-%E4%B8%AD-postgres-%E7%9A%84%E9%85%8D%E7%BD%AE)\n        - [添加 PostgreSQL 数据库](#%E6%B7%BB%E5%8A%A0-postgresql-%E6%95%B0%E6%8D%AE%E5%BA%93)\n        - [配置数据库](#%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93)\n        - [还原数据库](#%E8%BF%98%E5%8E%9F%E6%95%B0%E6%8D%AE%E5%BA%93)\n- [其他](#%E5%85%B6%E4%BB%96)\n- [Ubuntu 20.04](#ubuntu-2004)\n- [Leaf 的使用](#leaf-%E7%9A%84%E4%BD%BF%E7%94%A8)\n- [配置远程 vscode remote](#%E9%85%8D%E7%BD%AE%E8%BF%9C%E7%A8%8B-vscode-remote)\n- [配置 VSCode，编写 Swift 代码更舒心](#%E9%85%8D%E7%BD%AE-vscode%E7%BC%96%E5%86%99-swift-%E4%BB%A3%E7%A0%81%E6%9B%B4%E8%88%92%E5%BF%83)\n\n\u003c!-- /TOC --\u003e\n\n# 项目模仿参考\n\n* [https://www.xiaoduyu.com/](https://www.xiaoduyu.com/) \n* [源码](https://github.com/54sword/api.xiaoduyu.com)\n\n# 项目规划\n\n| 项目 | 源码 |\n|-----|------|\n| web网站 | [https://github.com/swiftdo/web-team-boke.git](https://github.com/swiftdo/web-team-boke.git)|\n| App（iOS\\Android）| [https://github.com/swiftdo/app-team-boke.git](https://github.com/swiftdo/app-team-boke.git) |\n| 后端API | [https://github.com/swiftdo/team-boke.git](https://github.com/swiftdo/team-boke.git)|\n| 后台管理 |[https://github.com/swiftdo/admin-team-boke.git](https://github.com/swiftdo/admin-team-boke.git) |\n\n\n# 分支管理\n\n* main 是稳定分支\n* dev 是开发分支\n\nmain 的改动会触发项目的自动部署，无需人工改动\n\n\n# 表设计\n\n* users 用户\n    * id\n    * name\n    * email\n    * is_email_verified 邮箱是否验证\n    * avatar 头像\n    * role_id 角色id \n    * created_at\n    * updated_at\n    * `last_sign_at`:Date 最近一次登录\n    * blocked:Bool 是否屏蔽用户 \n    * banned_to_post: Date  禁言，在该时间前不能发布言论\n    * gender: enum 性别 0女, 1男, 2 其他， 可以设计为枚举\n    * brief：String 简介,一句话介绍自己，70个字符限制\n    * source: 用户注册来源, 0-\u003eiPhone, 1-\u003eiPad, 2-\u003eAndroid, 3-\u003eH5, 4-\u003e网站, 5-\u003eiOS\n    * posts_count：int 帖子累积\n    * comment_count：int 评论累积\n    * fans_count: int 粉丝累积\n    * like_countL: int 获取赞累积\n    * follow_people_count: 用户关注人累积  - follow_peoples\n    * follow_posts_count: 关注的话题累积 -- follow_posts\n    * block_people_count: 屏蔽人的数量  -- block_peoples\n    * find_notification_at: Date 最近一次查询Notification的日期\n    \n\n* user_auths 用户认证账号 \n    * id\n    * user_id\n    * auth_type  类型 email, wxapp\n    * identifier 标志 (手机号，邮箱，用户名或第三方应用的唯一标识)\n    * credential 码凭证(站内的保存密码， 站外的不保存或保存 token)\n    * created_at\n    * updated_at\n\n* role 角色\n    * id \n    * name\n    \n* roles_permissions 关系表\n    * id\n    * role_id \n    * permission_id\n\n* permissions 权限\n    * id \n    * name\n    \n* access_tokens \n    * id \n    * token\n    * user_id\n    * expires_at\n\n\n* notifications（通知）\n    * id \n    * sender_id\n    * addressee_id\n    * target\n    * type\n    * deleted: bool\n    * created_at\n\n* user_notifications\n    * id \n    * type https://github.com/54sword/api.xiaoduyu.com/blob/master/src/schemas/user-notification.ts\n    * send_id\n    * addressee_id\n    * posts_id\n    * comment_id\n    * has_read: Bool\n    * deleted: Bool\n    * created_at\n\n* message: \n    * id \n    * user_id\n    * addressee_id\n    * type 1. 普通消息 2系统消息\n    * content: 内容\n    * content_html \n    * created_at \n    * device\n    * ip\n    * has_read\n    * blocked 是否被屏蔽\n    * deleted: 是否删除\n\n\n* topics 话题\n    * id\n    * user_id\n    * parent_id 父\n    * name  名称\n    * brief 摘要\n    * desc 详情\n    * avator 节点图标\n    * background 背景图\n    * follow_count 关注总数\n    * post_count  提问累积\n    * comment_count 评论总数\n    * sort 排序\n    * created_at\n    * language: 语言\n    * recommend: 是否推荐\n    * last_posts_at: 最近发帖的日期\n    * children: 与子的关系\n\n* reports 举报\n    * id\n    * user_id\n    * post_id \n    * comment_id\n    * people_id\n    * detail\n    * created_at\n    \n* posts 帖子\n    * id\n    * user_id\n    * topic_id\n    * type: 0 提问 1 分享\n    * title: 标题\n    * content: 内容\n    * content_html 内容转化后的html 格式\n    * created_at\n    * updated_at\n    * last_comment_at\n    * comment: 关系，评论\n    * comment_count: 评论数\n    * replay_count: 回复\n    * view_count: 浏览数\n    * follow_count: 关注\n    * like_count: 点赞数\n    * device: 设备\n    * ip \n    * deleted_at\n    * verify: 是否是审核\n    * recommend: 是否推荐\n    * weaken: 削弱，将不再出现在首页\n\n* blocks 屏蔽\n    * user_id \n    * post_id\n    * comment_id\n    * people_id\n    * deleted_at\n    * created_at\n    * ip\n\n* comments\n    * user_id \n    * post_id\n    * parent_id\n    * reply_id\n    * content\n    * content_html\n    * created_at\n    * updated_at\n    * last_reply_at\n    * reply_count\n    * reply \n    * like_count\n    * device\n    * ip\n    * blocked: bool\n    * deleted: bool\n    * verify: 内容校验是否成功\n    * weaken: 削弱\n    * recommend: 推荐\n\n* like\n    * user_id\n    * type\n    * target_id\n    * mood 0 赞 1 喜欢\n    * deleted: bool\n    * created_at\n\n* follow \n    * user_id\n    * post_id\n    * topic_id\n    * people_id\n    * deleted\n    * created_at\n\n* feeds 动态流\n    * user_id\n    * topic_id\n    * post_id\n    * comment_id\n    * deleted\n    * created_at\n\n# 自定义工作目录\n\n![](https://docs.vapor.codes/4.0/images/xcode-scheme-options.png)\n\n如果是 xcode 运行，需要设置为当前项目根目录\n\n# 路由\n\n# 数据库\n\n1; 安装\n\n```sh\n$ brew install postgresql\n\n$ brew link postgresql\n```\n\n2; 启动\n\n```sh\n$ brew services start postgresql\n```\n\n3; 关闭\n\n```sh\n$ brew services stop postgresql\n```\n\n4; 创建一个 PostgreSQL 用户\n\n```sh\n$ createuser username -P\n#Enter password for new role\n#Enter it again\n```\n\n上面的`username`是用户名，回车输入 2 次用户密码后即用户创建完成。更多用户创建信息可以`createuser –help`查看。\n\n5; 创建数据库\n\n```sh\n$ createdb dbname -O username -E UTF8 -e\n```\n\n上面创建了一个名为`dbname`的数据库，\n并指定`username`为改数据库的拥有者（owner），\n数据库的编码（encoding）是 UTF8，\n参数 `-e` 是指把数据库执行操作的命令显示出来。\n\n6; 删除数据库\n\n```sh\ndropdb -h localhost -p 5432 -U username dbname\n```\n\n-e：显示`dropdb`生成的命令并发送到数据库服务器。\n-h host：指定运行服务器的主机名。\n-p port：指定服务器监听的端口，或者 socket 文件。\n-U username：连接数据库的用户名。\n\n`dbname`要删除的数据库名\n\n本项目中运行的方式是：\n\n```sh\ncreateuser vapor -P\ncreatedb blog -O vapor -E UTF8 -e\n```\n\n**注意**\n\n1. 更改数据库后，需要写迁移代码，完成后记得执行 `vapor run migrate`\n2. 模型间有依赖关系，注意迁移类的调用顺序\n\n# 认证\n\n1. 用户+密码换取 access_token 和 refresh_token\n2. 通过 access_token 校验，判断是否登录\n3. 如果 access_token 过期，通过 refresh_token 重新生成 access_token\n4. 如果 access_token 过期，那么需要用户重新登录\n\n# Heroku 部署\n\n[Heroku](https://www.heroku.com/) 平台的灵活性极高且支持多种编程语言。若想把程序部署到 Heroku 上，开发者可以直接使用 Git 把程序推送到 Heroku 的 Git 服务器上。在服务器上, git push 命令会自动触发安装、配置和部署程序。\n\n## 注册 Heroku 账户\n\n您将需要一个 heroku 帐户，如果您没有，请在此处注册：[https://signup.heroku.com/](https://signup.heroku.com/)\n\n## 通过 cli 方式进行 heroku 部署\n\n### 安装 cli\n\n确保已安装 heroku cli 工具。\n\n- HomeBrew\n\n  ```sh\n  brew install heroku/brew/heroku\n  ```\n\n- 其他安装选项\n  在此处查看替代安装选项：[https://devcenter.heroku.com/articles/heroku-cli#download-and-install](https://devcenter.heroku.com/articles/heroku-cli#download-and-install).\n\n### 登录\n\n安装 cli 后，请输入以下内容：\n\n```sh\n$ heroku login\n```\n\n用以下命令来验证邮箱是否登录：\n\n```sh\n$ heroku auth:whoami\n```\n\n### 创建一个应用程序\n\n访问 [dashboard.heroku.com](https://dashboard.heroku.com)，登录您的帐户，并从右上角的下拉列表中创建一个新应用程序。按照 Heroku 提供的提示进行操作即可。\n\n### 与 Heroku 连接\n\n将您的应用程序与 heroku 连接（your-apps-name-here 替换为您的应用程序名称）\n\n```sh\n$ heroku git:remote -a your-apps-name-here\n```\n\n### 设置 Buildpack\n\n设置 buildpack 告诉 heroku 如何处理这个 vapor 项目。\n\n```sh\n$ heroku buildpacks:set vapor/vapor\n```\n\n### Swift 版本文件\n\nbuildpack 会寻找一个.swift-version 文件，获知使用的 swift 版本。 （可根据自己的项目来替换下面的 5.2.1）\n\n```sh\necho \"5.2.1\" \u003e .swift-version\n```\n\n这将创建 `.swift-version` 文件，内容为 5.2.1。\n\n### Procfile\n\nHeroku 使用 Procfile 知道如何运行您的应用程序，我们可以使用下面：\n\n```sh\nweb: Run serve --env production --hostname 0.0.0.0 --port $PORT\n```\n\n可以使用以下终端命令进行创建:\n\n```sh\necho \"web: Run serve --env production\" \\\n  \"--hostname 0.0.0.0 --port \\$PORT\" \u003e Procfile\n```\n\n### 部署到 Heroku\n\n您已经准备好部署，可以在终端上运行它。构建可能需要一段时间。\n\n```sh\n$ git push heroku main\n```\n\n### Scale Up\n\n成功构建之后，您需要添加至少一台服务器，一台网络是免费的，您可以通过以下方式获得它：\n\n```sh\nheroku ps:scale web=1\n```\n\n### 持续部署\n\n每当您想更新时，只需将最新的更改放入 main 并推送到 heroku，它将重新部署。\n\n\n## 在 heroku 控制台进行部署\n\n除了以上的方式，其实直接在 heroku 控制台操作即可，相对来说会简单好多：\n\n项目同样需要配置 `Swift 版本文件` 和 `Procfile`, 这两部跟 cli 操作一样，然后将修改提交到 github 上。\n\n在 heroku 创建应用后，可在做如下图的配置：\n\n\n![](http://mmbiz.qpic.cn/mmbiz_png/3wD9LKPpvOUoeQH5iajQhnoq1jiaYMYBkeCVWbuu3EL7KUgxeLbaupCsOiaL0BnEEiaiaoVQzSQomyUFE8YEoOLibibmw/0?wx_fmt=png)\n\n我们配置了与 github 仓库的关联，且配置了，在 main 分支的有提交的时候，自动进行部署，无需人工操作。\n\n然后还需配置 `buildpacks`:\n\n\n![](http://mmbiz.qpic.cn/mmbiz_png/3wD9LKPpvOUoeQH5iajQhnoq1jiaYMYBkeLOGpLRntvjKjakSRQicwLy8PUp54mgicPTFcDtR5mI1u4TVUmt3UNGpw/0?wx_fmt=png)\n\n点击添加 `add buildpack`, 将url(https://github.com/vapor-community/heroku-buildpack)填入即可：\n\n![](http://mmbiz.qpic.cn/mmbiz_png/3wD9LKPpvOUoeQH5iajQhnoq1jiaYMYBkeeAurXxrLqmb7Ys63gc7bt6ZMR2013wFJtrevB37icx8tst40YpUDLicg/0?wx_fmt=png)\n\n\n## heroku 中 Postgres 的配置\n\n### 添加 PostgreSQL 数据库\n\n在 [dashboard.heroku.com](https://dashboard.heroku.com) 访问您的应用程序，然后转到 `Add-ons` 部分。\n\n从这里输入 `postgres`，您将看到`Heroku Postgres`的选项，选择它。\n\n选择`hobby dev free plan`，并进行配置。 剩下的事由 Heroku 完成。\n\n完成后，您将看到数据库显示在 `Resources` 选项卡下。\n\n### 配置数据库\n\n现在，我们必须告诉我们的应用程序如何访问数据库。在项目的根目录中，运行以下命令：\n\n```sh\n$ heroku config\n```\n\n这将会有如下输出：\n\n```sh\n=== today-i-learned-vapor Config Vars\nDATABASE_URL: postgres://cybntsgadydqzm:2d9dc7f6d964f4750da1518ad71hag2ba729cd4527d4a18c70e024b11cfa8f4b@ec2-54-221-192-231.compute-1.amazonaws.com:5432/dfr89mvoo550b4\n```\n\n`DATABASE_URL` 此处将代表 postgres 数据库。不要将这个 URL 写入到你的代码中，这也是一个坏习惯。\n\n下面是一个数据库配置的样例\n\n```swift\nif let databaseURL = Environment.get(\"DATABASE_URL\") {\n    app.databases.use(try .postgres(\n        url: databaseURL\n    ), as: .psql)\n} else {\n    // ...\n}\n```\n\n如果您使用 `Heroku Postgres's standard plan`，则需要 `Unverified TLS `。\n\n不要忘记提交你所做的修改：\n\n```sh\ngit add .\ngit commit -m \"configured heroku database\"\n```\n\n### 还原数据库\n\n你可以使用 heroku 的 run 命令执行 `revert` 或者其他命令。默认情况下执行的是 `Run`。\n\n还原数据库：\n\n```sh\n$ heroku run Run -- revert --all --yes --env production\n```\n\n迁移：\n\n```sh\n$ heroku run Run -- migrate --env production\n\n# 或者指定 app\nheroku run Run  --app=teamboke  --env production -- migrate\n```\n\n# 其他\n\n杀死指定端口的进程\n\n```sh\nlsof -i:8080\nkill xxxx\n```\n\n创建文件夹\n\n```\nmkdir -p Resources/Views\n```\n\n# Ubuntu 20.04 \n\n* swiftenv\n* clang\n* vapor\n* zlib: sudo apt install zlib1g-dev\n\n# Leaf 的使用\n\n模板复用，需要用到 `#extend`，`#import` 和 `#export`，那么如何理解这三个tag:\n\n`#extend` 标签允许您将一个模板的内容复制到另一个模板中。\n\n`#import` 是暴露一个插槽。\n\n`#export` 是实现特定的插槽。\n\n举例：\n\n```html\n\u003c!-- base.html --\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003ctitle\u003e#(title)\u003c/title\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e#import(\"body\")\u003c/body\u003e\n\u003c/html\u003e\n```\n\n`base.html` 是个模板，它里面通过 `#import` 定义了 body 这么一个插槽，方便扩展它的文件可以自定义实现。\n\n复用这个`base.html`模板，假设我们创建了 `welcome.html`：\n\n```html\n\u003c!-- welcome.html --\u003e\n#extend(\"base\"):\n    #export(\"body\"):\n        \u003cp\u003eWelcome to TEAM-BOKE!\u003c/p\u003e\n    #endexport\n#endextend\n```\n\n`#extend` 后面是我们要扩展的文件名，比如我们要扩展 `base.html`, 那么就传入 `base` 即可。\n\n`#export` 是我们对基模板中的插槽的自定义实现，指明需要实现的插槽的名字。\n\n那么当 `[\"title\": \"Hi there!\"]` 从`Swift`传递过来时，`welcome.html`将被渲染为：\n\n```html\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003ctitle\u003eHi there!\u003c/title\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\u003cp\u003eWelcome to TEAM-BOKE!\u003c/p\u003e\u003c/body\u003e\n\u003c/html\u003e\n```\n\n# 配置远程 vscode remote\n\n非常方便编写服务器代码\n\n1.在插件市场中搜索并安装 Remote Development\n2.执行 ssh-keygen 命令创建密钥\n\n```shell\nssh-keygen -t rsa -C  'your email@xxx.com'\n```\n\n3.生成ssh key了之后，需要将ssh key放到远程服务器上。\n\n使用 scp 命令将本地的公钥文件 id_rsa.pub 复制到需要连接的Linux服务器：\n\n```shell\nscp ~/.ssh/id_rsa.pub 用户名@ip:/home/id_rsa.pub\n```\n\n4.登录服务器，把公钥追加到服务器ssh认证文件中：\n\n```shell\ncat /home/id_rsa.pub \u003e\u003e ~/.ssh/authorized_keys\n```\n\n5.使用 `cmd+shift+p` 的快捷键调用命令，执行 `Remote-SSH:Connect to Host...`, 然后选择配置文件的路径\n\n图文教程可[参考文章](https://zhuanlan.zhihu.com/p/68330319)\n\n\n# 配置 VSCode，编写 Swift 代码更舒心\n\n在 Linux 的环境中，建议用swiftenv 安装Swift，因为这样安装可以快速管理多个swift版本。\n\n在用 VSCode 编写 Swift 代码，首先我们需要代码高亮，代码自动补全。这是两个非常基础的需求。\n\n对于代码高亮VSCode 已经帮我们支持了。\n\n那么自动补全的话，我们需要安装 SourceKit-LSP 的插件。\n\nLSP的全程是Language Sever Protocol，是微软提出的一项标准化协议，旨在统一开发工具与Lanuguage Server之间的通信。LSP为支持的语言提供了一套通用的功能集，包括：语法高亮、自动补全、定义跳转、查找引用等等。\n\nSwift ToolChain 中已经集成了 `LSP`, 不行，你可以快速找下路径：\n\n```shell\n$ which sourcekit-lsp\n/home/mac/.swiftenv/shims/sourcekit-lsp\n```\n\n\u003e sourcekit-lsp 这个路径等下配置 vscode 的时候我们需要用到。\n\n第二步，就是安装插件，很幸运，苹果给我们写好了文档，操作下来也没啥问题\n\n[VSCode SourceKit-LSP 插件文档](https://github.com/apple/sourcekit-lsp/blob/main/Editors/vscode/README.md)\n\n第三步，配置 sourcekit 的路径。\n\n![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a962fba79bff48338656781bf33d2dcd~tplv-k3u1fbpfcp-watermark.awebp)\n\n将 Sourcekit-lsp: Server Path 中的路径配置为 `/home/mac/.swiftenv/shims/sourcekit-lsp`。\n然后重启 VSCode，便可支持代码自动补全、定义跳转等功能。\n\n如果还需要更丰富的配置，如代码格式化，Debug 等，那么可以参考这篇文章：[在Linux系统上搭建Swift开发调试环境](https://juejin.cn/post/6929392693806120968#heading-20)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswiftdo%2Fteam-boke","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswiftdo%2Fteam-boke","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswiftdo%2Fteam-boke/lists"}