.. SPDX-License-Identifier:	CC-BY-NC-SA-4.0

发布与更新自己的拓展吧
========================

到了这一步，想必你通过阅读教程或者直接参考现有代码，自己的拓展已经积累了不少\
内容了吧？既然如此，为何不分享出去让大家都看到呢？因此本节将介绍发布拓展的方\
法。

要发布拓展，步骤很简单：将拓展建立成Git仓库，并托管到Gitee等平台即可。这个对\
于经验充足的人而言非常简单，但对于连Git都没听说过的人还是有相当难度的——无妨，\
我们接下来慢慢的介绍就行。

关于Git
--------

Git是众多版本控制工具之一。版本控制是一种记录一个或若干文件内容变化，以便将\
来查阅特定版本修订情况的系统。大体上来说，他是使用一个本地数据库管理不同文件\
的各个版本。当然，作为初来乍到的新月杀拓展学习者，你只要知道Git是我们用来发布\
和更新拓展的工具就行啦。

如果你之前接触过太阳神三国杀拓展开发的话，你可能用这种方式管理和发布拓展：直接\
复制一份出来，把文件夹改成拓展包-X.X，这就是新版本；然后打个包并发到网上。这种\
方法固然简单直观，但也存在几个明显的问题：

  - 更新不便，每更新一下就要把整个拓展都重新下载一遍
  - 复制了太多文件夹出来，占了太多地方
  - 其他玩家更新拓展的时候操作不便

第一个问题往往是那些大体量拓展（>30MB左右）的痛点，因此拓展开发者后来又想出了\
“补丁更新”的形式——先让玩家下载某个版本安装着，自己更新接下来几个版本的时候，就\
只发一个小补丁，这样玩家的下载量就减轻了。但是这样一来，当版本更新了几次之后，\
补丁的制作难度也越来越大——文件太多太杂啦！

所以我们一开始制作新月杀的时候选择Git来更新拓展包就是为了解决以上的几个问题。\
只要你在游玩新月杀，就该体验到更新的便捷性了：每次进服务器都会先自动更新一下拓\
展包，然后就能加入了，只要不是第一次下载的话更新也用不了多长时间。而且开发者的\
操作也方便多了，从来不需要向群文件（或者诸如网盘之类的）里面发打包好的zip包。\

事实上，这样的自动更新功能就是Git实现的。下面我们就来正式接触Git吧。

安装Git
--------

前往\ https://git-scm.com/download/win\ 下载git，下载64-bit Git for \
Windows Setup。这样应该会为您下载一个exe安装包。

考虑到官网的下载链接实际上指向github，而且可能连官网的都进不去，所以也可考虑\
https://mirrors.tuna.tsinghua.edu.cn/github-release/git-for-windows/git/\ 。

Git的安装流程就是不断无脑的点下一步了，下一步下一步下一步……除了这里：

.. figure:: pic/6-1.jpg
   :align: center

   修改默认编辑器为vscode

这里默认会使用Vim，切记改成Visual Studio Code再点下一步！

在各种下一步之后，安装就完成了。在桌面上右键单击，如果右键菜单有Git bash here\
的话，就说明安装成功啦。

虽然网上流传着许许多多的Git图形化客户端，但是本文将只会介绍Git命令行的使用！\
这是因为只有在命令行模式下你才能执行Git的\ **所有**\ 命令，而大多数的GUI软件\
为了降低难度，只会让你能执行一小部分操作。如果你学会了在命令行下如何操作，\
那么你在操作GUI软件时自然也不会遇到什么困难。但是反过来就不成立了。

点开Git bash here就是开启命令行了。什么你从来没接触过命令行？那么赶紧去看\
《新月杀新人入门》的第11章吧。虽然题目说的是Linux的使用，但是对Git bash是同样\
适用的！（除了Git bash不可以用apt命令）在Git bash里面对着那一章操练一下，熟悉\
命令行的基本操作以及几个基本命令（ls、pwd、cd、mv啥的）再来接着阅读后文吧。

.. note::

   在Git bash中，所谓的“家目录”指的就是C:\Users\<你的用户名>。由于种种机缘\
   巧合，Windows版的Git没有中文版，你得去学着看懂那些英文才行。

初次运行Git
------------

熟悉了一下命令行的操作之后，我们便可以好好接触git本身了。

在随便某个文件管理器或者桌面右键->Git bash here就能打开终端了……下面我们来做一\
些初次运行的配置吧。我们的目标是发布拓展，也就是上传到Gitee中，所以我们需要先\
让Gitee知道我们这台电脑对应着自己的那个账号才行，不然git命令行不好操作啦。

.. note::

   可能有些人会反感gitee，但对于发布拓展而言这似乎是为数不多的好选择了。你也\
   可以发布到Github，如果你能保证所有游玩你拓展的人全都能顺利连上github的话。

好，开始吧，首先第一件事是告诉本机的git你是谁：

.. code:: sh

  $ git config --global user.email "你的Git邮箱"
  $ git config --global user.name "你的Git用户名"

这两行命令之后就告诉了git你自己的身份了。这里运行的程序名是git；参数1“config”\
表示要做的git操作类型是自定义配置，选项“--global”表示全局有效，参数3表示要配\
置的配置项，最后一个参数就是配置的值了。

接下来就是要告诉Gitee，自己这台电脑可以给自己的账户用了。Git采取的是SSH Key的\
认证策略，所以我们紧接着要来配置。

.. hint::

   SSH Key更具体一点是采用RSA加密来进行认证的。RSA加密是一种常见的非对称加密\
   方式，你自己手上会有一个“公钥”和“私钥”，私钥自己保留，公钥可以告诉任何人。\
   因为必须要知道私钥内容才能认为公钥有效，所以只要你手上有私钥，就起到认证\
   身份的作用了。更多信息可以自己去网上查询到。

我们先在命令行中敲以下这些命令，来创建好自己的一对密钥：

.. code:: sh

   $ ssh-keygen -t rsa -C "你注册用的邮箱地址" # 换成自己真正的邮箱
     # 出来一堆东西，一路点回车就是了
   $ cat ~/.ssh/id_rsa.pub
     # 出来一堆乱七八糟的东西：ssh-rsa <一大堆乱七八糟的内容> <你的邮箱>

注意井号开头的表示注释；没错，命令行也可以写注释的，毕竟命令行本身也是一种脚本\
语言（我们用不到它的编程功能就是了）。总之输命令的时候无需输入井号之后的内容。

在命令\ ``cat ~/.ssh/id_rsa.pub``\ 中，出来的那一堆以ssh-rsa开头的输出，\
就是我们刚刚创建好的公钥。只要把公钥告诉gitee就能证明自己的身份了。

进入Gitee网页，然后如下操作：

1. 点右上角你的头像，点账号设置
2. 点左侧栏中 安全设置 - SSH公钥
3. 此时弹出公钥添加界面，标题任选，下面公钥栏中，将刚刚生成的公钥复制粘贴上去
4. 点确定

这样就配置好了ssh公钥。我们还是验证一下配置是否成功吧，使用命令：

::

   $ ssh -T git@gitee.com
   Hi xxxx! You've successfully authenticated, but GITEE.COM does not provide shell access.

输出像Hi xxx!这样的信息，就说明配置成功了。否则需要进一步检查自己的操作，\
上网查一下吧。

到这一步为止，你已经完成了git的初步配置，现在你已经有能力将拓展包发布出去了。

为拓展包创建git仓库
--------------------

用文件管理器打开自己正在制作的那个拓展包的文件夹，右键Git bash here打开命令行。

.. figure:: pic/6-2.png
   :align: center

   打开Git bash

.. figure:: pic/6-3.jpg
   :align: center

   Git bash的界面

从命令提示符中可以看到我们现在的当前目录就是拓展包的文件夹。不过此时这里还建\
立Git仓库，所以我们要使用如下命令先创建一个空白的仓库：

.. code:: sh

   $ git init

在这个命令中，运行的程序依然是git，操作类型是init，表示新建空仓库。（或称为初\
始化仓库，反正都一个意思）

可是我已经写了这么多代码了，为什么新建的仓库却是空的呢？明明已经有这么多文件\
了呀。为了弄明白这些，我们需要先知道Git的三种状态：

- 已修改（modified）：表示修改了文件，但还没保存到Git数据库中。
- 已暂存（staged）：表示对一个已修改文件的当前版本做了标记，使之包含在下次提\
  交的内容中。
- 已提交（commit）：表示数据已经安全地保存在本地Git数据库中。

Git数据库又是个啥呢？大致的说，这是保存着仓库所有文件及其修改记录的地方。你对\
文件做出的种种修改、新增、删除，Git都给你妥善保管者，前提是你提交了那些修改。\
在运行完\ ``git init``\ 命令之后，你的拓展包文件夹里面就会出现一个.git文件夹，\
那是个隐藏文件夹，里面的内容就是Git为你保存的数据。

关于所谓的暂存啊提交啊三言两语很难讲明白，还是得从实践着手。既然现在我们已经\
创建好空仓库了，下一步我们就应该让Git追踪这些文件并创建初始提交了。使用命令：

.. code:: sh

   $ git add .  # 将文件夹中所有的文件都加入暂存区
   $ git commit -m "init" # 提交目前所有的文件，这样文件就正式存在于仓库里面了

在\ ``git add .``\ 中，那个点表示的就是“当前目录”。回忆一下前面所说的，点点\
表示的是上级目录。add的作用就是将这些文件加入暂存区。而commit意为提交，选项\
\ ``-m``\ 表示提交信息（你得用一句话表示这个提交是干啥的），这里随便写了一句\
init表示这是本仓库的第一次提交。

这样一来，初始提交也完成了，现在我们已经有了一个真实项目的Git仓库了，并从仓库\
里面\ *检出*\ 了所有文件的\ **工作副本**\ 。（所谓检出就是从Git数据库中拿出那\
个文件，仓库中所有文件都是在Git管理范围内的）通常，你会对这些文件做些修改，每\
当完成了一个阶段的目标，想要将记录下它时，就将它提交到仓库。

请记住，你工作目录下的每个文件都不外乎这两种状态：\ **已跟踪**\ 或\
**未跟踪**\ 。已跟踪的文件是指那些被纳入了版本控制的文件，在上一次快照中有它们\
的记录，在工作一段时间后，它们的状态可能是未修改，已修改或已放入暂存区。\
简而言之，已跟踪的文件就是Git已经知道的文件。

因为我们这里暂存了所有文件并把它们都提交了，所以现在所有的文件都处于已跟踪\
状态。我们还是继续完成最初的目的吧，将自己的拓展发到gitee上去才好。

上传拓展
----------

要将新仓库发到gitee去，你首先得在网页里面新建一个仓库。我们现在用的这个仓库\
名叫study，那就创建一个名为study的仓库吧。

.. figure:: pic/6-4.jpg
   :align: center

   在页面右上角找到新建仓库

.. figure:: pic/6-5.jpg
   :align: center

   创建与文件夹同名的仓库

注意下面初始化仓库啥的都不要勾选：

.. figure:: pic/6-6.jpg
   :align: center

   不勾选那三个初始化的框

这样一来，就在网页里面成功为自己账号创立了一个空仓库了。接下来要做的就是将\
自己的\ **本地**\ 仓库\ *推送*\ 到\ **远程仓库**\ 去。

网页里面应该已经告诉你如何操作命令行了，不过现在还是按照文章说的步骤来吧。

刚刚在网页中做的一系列操作就是创建了一个远程仓库。远程仓库存在的意义就是和\
他人进行协作，当然了备份也算个功能。不过我们的本地仓库还不知道自己已经有\
远程仓库了，现在我们就告诉他：

.. code:: sh

   $ git remote add origin git@gitee.com:你的用户名/study

这样一来，我们就创建了一个名叫“origin”的远程仓库（远端），他的url是后面那个。\
有了远程仓库的话，我们就可以进行推送与拉取了。推送就是将本地的内容发送到远程\
仓库去，拉取则反之。顺便，推送是push，拉取则是pull。至于远程仓库的名字为何是\
origin，这是因为\ ``git clone``\ 的时候默认会给远程仓库取这个名字。

接下来就将我们的master分支推送到远程仓库吧：

.. code:: sh

   $ git push

什么，推送失败了？这是因为我们现在还是第一次推送，\ ``git push``\ 命令不能用在\
第一次。第一次推送的话需要用这个命令：

.. code:: sh

   $ git push -u origin master

这个命令的作用就是把本地的master\ *分支*\ 和远端origin的master分支联系起来，\
以后就可以直接用git push命令了。

推送完成之后，刷新一下gitee的网页，你就发现文件都已经发上来了。快把仓库链接\
分享出来吧！（当然study就算了，可以多多分享自己的DIY仓库）

更新拓展
---------

又回到更新这个话题上来了。欲更新拓展，需要走如下几步：

1. 修改已有的文件，这样才有东西可以更新嘛
2. 用\ ``git add .``\ 命令暂存所有文件，这样自然就包含了要更新的文件
3. 用\ ``git commit -m "xxx"``\ 命令创建好提交
4. 用\ ``git push``\ 命令完成推送，至此完成更新

还是举个例子为好。我们现在做的拓展也已经属于万千开源项目之一了，开源项目自然\
要有自己的许可证。因为新月杀本身是GPLv3协议开源的，所以拓展也需要用这个协议\
开源（协议里面规定了），声明协议的方式就是复制一个LICENSE文件进来。

新月杀本体里面已经包含一个LICENSE了，把他复制到拓展包文件夹里面吧。

复制了LICENSE文件之后文件夹内长这样：

.. figure:: pic/6-7.png
   :align: center
   
   复制了LICENSE之后

然后在git bash操作吧：

.. code::sh

   $ git add .
   $ git commit -m "add license"
   $ git push

这样一来，我们就成功提交了最新的改动，并且推送到了Gitee。这就是拓展更新的步骤。
