code.gitea.io/gitea@v1.22.3/docs/content/development/hacking-on-gitea.zh-cn.md (about)

     1  ---
     2  date: "2016-12-01T16:00:00+02:00"
     3  title: "玩转 Gitea"
     4  slug: "hacking-on-gitea"
     5  sidebar_position: 10
     6  toc: false
     7  draft: false
     8  aliases:
     9    - /zh-cn/hacking-on-gitea
    10  menu:
    11    sidebar:
    12      parent: "development"
    13      name: "玩转 Gitea"
    14      sidebar_position: 10
    15      identifier: "hacking-on-gitea"
    16  ---
    17  
    18  # Hacking on Gitea
    19  
    20  ## 快速入门
    21  
    22  要获得快速工作的开发环境,您可以使用 Gitpod。
    23  
    24  [![在 Gitpod 中打开](/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/go-gitea/gitea)
    25  
    26  ## 安装 Golang
    27  
    28  您需要 [安装 go]( https://go.dev/doc/install ) 并设置您的 go 环境。
    29  
    30  接下来,[使用 npm 安装 Node.js](https://nodejs.org/en/download/) ,这是构建
    31  JavaScript 和 CSS 文件的必要工具。最低支持的 Node.js 版本是 @minNodeVersion@
    32  并且推荐使用最新的 LTS 版本。
    33  
    34  **注意** :当执行需要外部工具的 make 任务时,比如
    35  `make watch-backend`,Gitea 会自动下载并构建这些必要的组件。为了能够使用这些,你必须
    36  将 `"$GOPATH"/bin` 目录加入到可执行路径上。如果你不把go bin目录添加到可执行路径你必须手动
    37  指定可执行程序路径。
    38  
    39  **注意2** :Go版本 @minGoVersion@ 或更高版本是必须的。Gitea 使用 `gofmt` 来
    40  格式化源代码。然而,`gofmt` 的结果可能因 `go` 的版本而有差异。因此推荐安装我们持续集成使用
    41  的 Go版本。截至上次更新,Go 版本应该是 @goVersion@。
    42  
    43  ## 安装 Make
    44  
    45  Gitea 大量使用 `Make` 来自动化任务和改进开发。本指南涵盖了如何安装 Make。
    46  
    47  ### 在 Linux 上
    48  
    49  使用包管理器安装。
    50  
    51  在 Ubuntu/Debian 上:
    52  
    53  ```bash
    54  sudo apt-get install make
    55  ```
    56  
    57  在 Fedora/RHEL/CentOS 上:
    58  
    59  ```bash
    60  sudo yum install make
    61  ```
    62  
    63  ### 在 Windows 上
    64  
    65  Make 的这三个发行版都可以在 Windows 上运行:
    66  
    67  - [单个二进制构建]( http://www.equation.com/servlet/equation.cmd?fa=make )。复制到某处并添加到 `PATH`。
    68    - [32 位版本](http://www.equation.com/ftpdir/make/32/make.exe)
    69    - [64 位版本](http://www.equation.com/ftpdir/make/64/make.exe)
    70  - [MinGW-w64](https://www.mingw-w64.org) / [MSYS2](https://www.msys2.org/)。
    71    - MSYS2 是一个工具和库的集合,为您提供一个易于使用的环境来构建、安装和运行本机 Windows 软件,它包括 MinGW-w64。
    72    - 在 MingGW-w64 中,二进制文件称为 `mingw32-make.exe` 而不是 `make.exe`。将 `bin` 文件夹添加到 `PATH`。
    73    - 在 MSYS2 中,您可以直接使用 `make`。请参阅 [MSYS2 移植](https://www.msys2.org/wiki/Porting/)。
    74    - 要使用 CGO_ENABLED(例如:SQLite3)编译 Gitea,您可能需要使用 [tdm-gcc](https://jmeubank.github.io/tdm-gcc/) 而不是 MSYS2 gcc,因为 MSYS2 gcc 标头缺少一些 Windows -只有 CRT 函数像 _beginthread 一样。
    75  - [Chocolatey包管理器]( https://chocolatey.org/packages/make )。运行`choco install make`
    76  
    77  **注意** :如果您尝试在 Windows 命令提示符下使用 make 进行构建,您可能会遇到问题。建议使用上述提示(Git bash 或 MinGW),但是如果您只有命令提示符(或可能是 PowerShell),则可以使用 [set](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1) 命令,例如 `set TAGS=bindata`。
    78  
    79  ## 下载并克隆 Gitea 源代码
    80  
    81  获取源代码的推荐方法是使用 `git clone`。
    82  
    83  ```bash
    84  git clone https://github.com/go-gitea/gitea
    85  ```
    86  
    87  (自从go modules出现后,不再需要构建 go 项目从 `$GOPATH` 中获取,因此不再推荐使用 `go get` 方法。)
    88  
    89  ## 派生 Gitea
    90  
    91  如上所述下载主要的 Gitea 源代码。然后,派生 [Gitea 仓库](https://github.com/go-gitea/gitea),
    92  并为您的本地仓库切换 git 远程源,或添加另一个远程源:
    93  
    94  ```bash
    95  # 将原来的 Gitea origin 重命名为 upstream
    96  git remote rename origin upstream
    97  git remote add origin "git@github.com:$GITHUB_USERNAME/gitea.git"
    98  git fetch --all --prune
    99  ```
   100  
   101  或者:
   102  
   103  ```bash
   104  # 为我们的 fork 添加新的远程
   105  git remote add "$FORK_NAME" "git@github.com:$GITHUB_USERNAME/gitea.git"
   106  git fetch --all --prune
   107  ```
   108  
   109  为了能够创建合并请求,应将分叉存储库添加为 Gitea 本地仓库的远程,否则无法推送更改。
   110  
   111  ## 构建 Gitea(基本)
   112  
   113  看看我们的
   114  [说明](installation/from-source.md)
   115  关于如何[从源代码构建](installation/from-source.md) 。
   116  
   117  从源代码构建的最简单推荐方法是:
   118  
   119  ```bash
   120  TAGS="bindata sqlite sqlite_unlock_notify" make build
   121  ```
   122  
   123  `build` 目标将同时执行 `frontend` 和 `backend` 子目标。如果存在 `bindata` 标签,资源文件将被编译成二进制文件。建议在进行前端开发时省略 `bindata` 标签,以便实时反映更改。
   124  
   125  有关所有可用的 `make` 目标,请参阅 `make help`。另请参阅 [`.drone.yml`](https://github.com/go-gitea/gitea/blob/main/.drone.yml) 以了解我们的持续集成是如何工作的。
   126  
   127  ## 持续构建
   128  
   129  要在源文件更改时运行并持续构建:
   130  
   131  ```bash
   132  # 对于前端和后端
   133  make watch
   134  
   135  # 或者:只看前端文件(html/js/css)
   136  make watch-frontend
   137  
   138  # 或者:只看后端文件 (go)
   139  make watch-backend
   140  ```
   141  
   142  在 macOS 上,监视所有后端源文件可能会达到默认的打开文件限制,这可以通过当前 shell 的 `ulimit -n 12288` 或所有未来 shell 的 shell 启动文件来增加。
   143  
   144  ### 格式化、代码分析和拼写检查
   145  
   146  我们的持续集成将拒绝未通过代码检查(包括格式检查、代码分析和拼写检查)的 PR。
   147  
   148  你应该格式化你的代码:
   149  
   150  ```bash
   151  make fmt
   152  ```
   153  
   154  并检查源代码:
   155  
   156  ```bash
   157  # lint 前端和后端代码
   158  make lint
   159  # 仅 lint 后端代码
   160  make lint-backend
   161  ```
   162  
   163  **注意** :`gofmt` 的结果取决于 `go` 的版本。您应该运行与持续集成相同的 go 版本。
   164  
   165  ### 处理 JS 和 CSS
   166  
   167  前端开发应遵循 [Guidelines for Frontend Development](contributing/guidelines-frontend.md)。
   168  
   169  要使用前端资源构建,请使用上面提到的“watch-frontend”目标或只构建一次:
   170  
   171  ```bash
   172  make build && ./gitea
   173  ```
   174  
   175  在提交之前,确保 linters 通过:
   176  
   177  ```bash
   178  make lint-frontend
   179  ```
   180  
   181  ### 配置本地 ElasticSearch 实例
   182  
   183  使用 docker 启动本地 ElasticSearch 实例:
   184  
   185  ```sh
   186  mkdir -p $(pwd) /data/elasticsearch
   187  sudo chown -R 1000:1000 $(pwd) /data/elasticsearch
   188  docker run --rm --memory= "4g" -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.type=single-node" -v "$(pwd)/data /elasticsearch:/usr/share/elasticsearch/data" docker.elastic.co/elasticsearch/elasticsearch:7.16.3
   189  ```
   190  
   191  配置`app.ini`:
   192  
   193  ```ini
   194  [indexer]
   195  ISSUE_INDEXER_TYPE = elasticsearch
   196  ISSUE_INDEXER_CONN_STR = http://elastic:changeme@localhost:9200
   197  REPO_INDEXER_ENABLED = true
   198  REPO_INDEXER_TYPE = elasticsearch
   199  REPO_INDEXER_CONN_STR = http://elastic:changeme@localhost:9200
   200  ```
   201  
   202  ### 构建和添加 SVGs
   203  
   204  SVG 图标是使用 `make svg` 命令构建的,该命令将图标资源编译到输出目录 `public/assets/img/svg` 中。可以在 `web_src/svg` 目录中添加自定义图标。
   205  
   206  ### 构建 Logo
   207  
   208  Gitea Logo的 PNG 和 SVG 版本是使用 `TAGS="gitea" make generate-images` 目标从单个 SVG 源文件 assets/logo.svg 构建的。要运行它,Node.js 和 npm 必须可用。
   209  
   210  通过更新 `assets/logo.svg` 并运行 `make generate-images`,同样的过程也可用于从 SVG 源文件生成自定义 Logo PNG。忽略 gitea 编译选项将仅更新用户指定的 LOGO 文件。
   211  
   212  ### 更新 API
   213  
   214  创建新的 API 路由或修改现有的 API 路由时,您**必须**
   215  更新和/或创建 [Swagger](https://swagger.io/docs/specification/2-0/what-is-swagger/)
   216  这些使用 [go-swagger](https://goswagger.io/) 评论的文档。
   217  [规范]( https://goswagger.io/use/spec.html#annotation-syntax )中描述了这些注释的结构。
   218  如果您想了解更多有关 Swagger 结构的信息,可以查看
   219  [Swagger 2.0 文档](https://swagger.io/docs/specification/2-0/basic-structure/)
   220  或与添加新 API 端点的先前 PR 进行比较,例如 [PR #5483](https://github.com/go-gitea/gitea/pull/5843/files#diff-2e0a7b644cf31e1c8ef7d76b444fe3aaR20)
   221  
   222  您应该注意不要破坏下游用户依赖的 API。在稳定的 API 上,一般来说添加是可以接受的,但删除
   223  或对 API 进行根本性更改将会被拒绝。
   224  
   225  创建或更改 API 端点后,请用以下命令重新生成 Swagger 文档:
   226  
   227  ```bash
   228  make generate-swagger
   229  ```
   230  
   231  您应该验证生成的 Swagger 文件:
   232  
   233  ```bash
   234  make swagger-validate
   235  ```
   236  
   237  您应该提交更改后的 swagger JSON 文件。持续集成服务器将使用以下方法检查是否已完成:
   238  
   239  ```bash
   240  make swagger-check
   241  ```
   242  
   243  **注意** :请注意,您应该使用 Swagger 2.0 文档,而不是 OpenAPI 3 文档。
   244  
   245  ### 创建新的配置选项
   246  
   247  创建新的配置选项时,将它们添加到 `modules/setting` 的对应文件。您应该将信息添加到 `custom/conf/app.ini`
   248  并到[配置备忘单](administration/config-cheat-sheet.md)
   249  在 `docs/content/doc/advanced/config-cheat-sheet.zh-cn.md` 中找到
   250  
   251  ### 更改Logo
   252  
   253  更改 Gitea Logo SVG 时,您将需要运行并提交结果的:
   254  
   255  ```bash
   256  make generate-images
   257  ```
   258  
   259  这将创建必要的 Gitea 图标和其他图标。
   260  
   261  ### 数据库迁移
   262  
   263  如果您对数据库中的任何数据库持久结构进行重大更改
   264  `models/` 目录,您将需要进行新的迁移。可以找到这些
   265  在 `models/migrations/` 中。您可以确保您的迁移适用于主要
   266  数据库类型使用:
   267  
   268  ```bash
   269  make test-sqlite-migration # 将 SQLite 切换为适当的数据库
   270  ```
   271  
   272  ## 测试
   273  
   274  Gitea 运行两种类型的测试:单元测试和集成测试。
   275  
   276  ### 单元测试
   277  
   278  `go test` 系统中的`*_test.go` 涵盖了单元测试。
   279  您可以设置环境变量 `GITEA_UNIT_TESTS_LOG_SQL=1` 以在详细模式下运行测试时显示所有 SQL 语句(即设置`GOTESTFLAGS=-v` 时)。
   280  
   281  ```bash
   282  TAGS="bindata sqlite sqlite_unlock_notify" make test # Runs the unit tests
   283  ```
   284  
   285  ### 集成测试
   286  
   287  单元测试不会也不能完全单独测试 Gitea。因此,我们编写了集成测试;但是,这些依赖于数据库。
   288  
   289  ```bash
   290  TAGS="bindata sqlite sqlite_unlock_notify" make build test-sqlite
   291  ```
   292  
   293  将在 SQLite 环境中运行集成测试。集成测试需要安装 `git lfs`。其他数据库测试可用,但
   294  可能需要适应当地环境。
   295  
   296  看看 [`tests/integration/README.md`](https://github.com/go-gitea/gitea/blob/main/tests/integration/README.md) 有关更多信息以及如何运行单个测试。
   297  
   298  ### 测试 PR
   299  
   300  我们的持续集成将测试代码是否通过了单元测试,并且所有支持的数据库都将在 Docker 环境中通过集成测试。
   301  还将测试从几个最新版本的 Gitea 迁移。
   302  
   303  请在PR中附带提交适当的单元测试和集成测试。
   304  
   305  ## 网站文档
   306  
   307  该网站的文档位于 `docs/` 中。如果你改变了文档内容,你可以使用以下测试方法进行持续集成:
   308  
   309  ```bash
   310  make lint-md
   311  ```
   312  
   313  ## Visual Studio Code
   314  
   315  `contrib/ide/vscode` 中为 Visual Studio Code 提供了 `launch.json` 和 `tasks.json`。查看
   316  [`contrib/ide/README.md`](https://github.com/go-gitea/gitea/blob/main/contrib/ide/README.md) 了解更多信息。
   317  
   318  ## Goland
   319  
   320  单击 `/main.go` 中函数 `func main()` 上的 `Run Application` 箭头
   321  可以快速启动一个可调试的 Gitea 实例。
   322  
   323  `Run/Debug Configuration` 中的 `Output Directory` 必须设置为
   324  gitea 项目目录(包含 `main.go` 和 `go.mod`),
   325  否则,启动实例的工作目录是 GoLand 的临时目录
   326  并防止 Gitea 在开发环境中加载动态资源(例如:模板)。
   327  
   328  要在 GoLand 中使用 SQLite 运行单元测试,请设置 `-tags sqlite,sqlite_unlock_notify`
   329  在 `运行/调试配置` 的 `Go 工具参数` 中。
   330  
   331  ## 提交 PR
   332  
   333  对更改感到满意后,将它们推送并打开拉取请求。它建议您允许 Gitea Managers 和 Owners 修改您的 PR
   334  分支,因为我们需要在合并之前将其更新为 main 和/或可能是能够直接帮助解决问题。
   335  
   336  任何 PR 都需要 Gitea 维护者的两次批准,并且需要通过持续集成。看看我们的
   337  [CONTRIBUTING.md](https://github.com/go-gitea/gitea/blob/main/CONTRIBUTING.md)
   338  文档。
   339  
   340  如果您需要更多帮助,请访问 [Discord](https://discord.gg/gitea) #Develop 频道
   341  并在那里聊天。
   342  
   343  现在,您已准备好 Hacking Gitea。