Odoo 12开发之开发环境准备

Odoo Alan 10个月前 (12-30) 12684次浏览 3个评论

本文为最好用的免费ERP系统Odoo 12开发手册系列文章第二篇。

在更深入了解 Odoo 开发之前,我们应配置好开发环境并学习相关的基础管理任务。本文中,我们将学习创建 Odoo 应用所需用到的工具和环境配置。这里采用 Ubuntu 系统来作为开发服务器实例的主机,可以是云服务器、本地服务器或者PC 上的虚拟机。

本文主要内容有:

  • 配置主机,可以是 Ubuntu系统或 PC 机上的 Linux 子系统
  • 使用源码安装 Odoo,包括数据库和系统依赖的安装
  • 管理 Odoo 数据库(创建、删除和拷贝)
  • 配置 Odoo 服务器选项
  • 查找并安装社区插件
  • 使用虚拟环境管理 Odoo 不同版本和项目
  • 开启服务端开发者模式简化开发任务

开发准备

本文将介绍如何在开发电脑上使用源码安装 Odoo,建议使用系统是Ubuntu 18.04 ,也可以选择 Windows 10,文中会介绍到如何在 Windows 下安装 Linux 子系统。相关代码可参见 GitHub 仓库

设置 Odoo 服务宿主机

推荐使用Debian/Ubuntu来运行 Odoo 服务。虽然 Odoo 是一个跨平台的系统,可以运行在不同的操作系统上,但事实上 Odoo 的研发(R&D)团队把 Debian 系作为参照部署平台。并且 Odoo 自己的 SaaS 平台也运行在 Debian 之上。这也是社区中最主流的选择,说明使用Debian 或 Ubuntu 会更容易寻求到帮助和建议。你也许仅有 Windows 相关背景,但对Debian 系有一定了解也非常重要。

当然你依然可以选择自己喜欢的系统,如 Windows, Mac 或其它Linux发行版本(如 CentOS)。

ℹ️本文中介绍的是在一个全新的系统中进行开发,如果你在已有系统中开发,请做好备份以在出错时进行恢复

使用 Windows 子系统安装 Linux

在 Windows 系统中,最简单的方案是使用 Windows 10自带的Linux子系统(WSL – Windows Subsystem for Linux)。通过子系统,我们可以在 Windows 内运行 Ubuntu 系统,足以应对 Odoo 开发所需的一切。更多 WSL 相关知识请参考官网

WSL 是Windows 10最近发布中的一个可选功能,使用前需要先启用。启用后即可在商店中安装 Ubuntu,详见官方帮助文档

在写本文时,需要如下步骤来完成安装:

第一步是要确保 WSL 功能已开启,以管理员身份打开 PowerShell 并运行:

以上命令需要在单行执行,然后根据提示重启电脑。然后我们就可以安装Ubuntu Windows应用,最简单地方式是在自带微软商店中搜索 Ubuntu,在写本文时最新的长期支持版本(LTS)是18.04,按照提示进行安装即可。运行 Ubuntu 应用会打开一个bash 命令行,这里可以输入在 Ubuntu 系统中相同的命令。需要记住在安装时配置的用户名和密码,因为在进行提权操作时会要求输入该信息(如运行 sudo 时)。

安装 Linux 服务器

我们还可以选择在电脑上安装 Linux,或在局域网乃至云端安装 Linux 系统。我们需要一台基于 Debian 的服务器用于 Odoo 服务端开发,如果此前你没有接触过 Linux, 请注意 Ubuntu 是一个基于 Debian 的 Linux 发行版本,所以两者极为相似。Odoo 保证可在当前稳定的 Debian 或 Ubuntu 版本上运行,在写本文时,分别为 Debian 9(Stretch)和Ubuntu 18.04 LTS(Bionic Beaver)。

更推荐选择 Ubuntu,因安装上较 Debian 容易。可从 Ubuntu 官网上下载 ISO 镜像,建议使用最新的 LTS 版本。如果你刚刚接触 Linux,使用预配置的镜像会更容易些。TurnKey Linux提供了含 ISO 的多种格式预安装镜像。ISO 格式可以在任意虚拟化软件上使用,即便是裸机。较优的选择是 LAPP 镜像,已安装了 Odoo 所需的Python 和 PostgreSQL。

为能够进行远程操作,通常需安装OpenSSH服务。在 Ubuntu 的设置助手中有这一服务,但也可以通过如下命令来进行安装:

然后需要使用 SSH(Secure Shell)客户端来连接 Odoo 的宿主机,Windows 中常用的有 PuTTYXShellSecureCRT

可以通过如下命令来查看服务器的 IP 地址:

使用 SSH 客户端可以远程操作 Linux 主机,还可以获得比在虚拟机终端操作更好的体验,我们可以更容易的复制粘贴、修改窗口大小、字体等。

补充:关于虚拟机 Hyper-V,  VMware, VirtualBox和 Vagrant 都是很好的方案,网上有很多资料,限于篇幅本文不再介绍。

源码安装 Odoo

在本系列文件第一篇使用开发者模式快速入门 Odoo 12中,我们介绍了快速运行 Odoo 的各种方式,本文中我们将更深入一步,直接通过源码来安装、运行 Odoo。

Odoo使用Python 编程语言,数据存储使用 PostgreSQL数据库,这是对 Odoo 主机的两大要求。要使用源码运行 Odoo,首先要安装其所依赖的 Python 库。然后从 GitHub 上下载源代码,虽然可以下载 zip 和 tar 文件,但使用 Git版本管理工具获取代码会更优。

ℹ️具体依赖的安装根据操作系统和安装的 Odoo 版本可能会不同。如果在上述步骤中存在问题,请参考官方文档,可切换版本查看其它版本的操作步骤。

安装 PostgreSQL 数据库

Odoo 要使用到 PostgreSQL服务,典型的开发设置是使用安装 Odoo 的同一台机器安装PostgreSQL。下面我们就来安装数据库服务:

最后这条命令为当前系统用户创建了一个PostgreSQL用户,用于 Odoo 实例创建或删除数据库时使用。

如果在 WSL内运行 Ubuntu,注意系统服务不会自动启动。也就是说运行任何需要数据库连接的命令(如createuser或启动 Odoo 服务)时都要手动开启PostgreSQL服务,手动启动PostgreSQL服务执行:sudo service postgresql start。

安装 Odoo 系统依赖

要运行 Odoo,我们还需要一些系统包和软件。获取版本控制的源码应安装 Git,安装运行 Odoo要求 Python 3.5或之后的版本、Python 3的 pip 以及一些 Python 包的系统依赖:

Odoo 9, 10, and 11版要用到less CSS 预处理器,所以对这些版本需要执行如下安装:

Odoo 12中无需执行如上命令,但通常我们也会用到前述版本,如果有此情况则仍需安装。

ℹ️Odoo 12中的修改
CSS 预处理器由 less 改成了 Sass,Sass 编译器无需进行额外安装,在 Odoo 12的 Python 依赖中已经安装了libsass-python。做出这一更改的原因有:Bootstrap 4由 less 调整为 Sass,已有 Python绑定和避免对 Node.js(或 Ruby)的依赖。

源码安装 Odoo

为便于管理,我们将在家目录下创建一个/odoo-dev目录作为工作目录。在本系列文章中我们均假设 Odoo 安装在/odoo-dev目录下。

Odoo 使用的是 Python 3(3.5或之后的版本),那么在命令行中我们将不再使用python和pip,而是用python3和 pip3。

ℹ️Odoo 11的修改
从版本11开始,Odoo 运行在 Python 3.5及以后的版本上,Odoo 11依然支持 Python 2.7,但 Odoo 12仅能运行在Python 3.5+的环境中。Odoo 10及之前的版本仅可运行在Python 2.7上。

要从源码安装 Odoo,我们首先要从 GitHub 上克隆一套 Odoo 源代码:

~是用户家目录的简写,比如/home/alan。

如果使用 WSL Windows 子系统,家目录存放在一个Windows 系统文件夹中一个不易于发现的地方。避免这一情况的一个方法是把工作文件放在常用的文件夹下,然后在子系统中使用软链接(类似 Windows中的快捷方式)。比如mkdir /mnt/c/Users/Public/odoo-dev创建C:\Users\Public\odoo-dev工作目录,然后ln -s /mnt/c/Users/Public/odoo-dev ~/odoo-dev创建~/odoo-dev Linux目录,实际上是 Windows 目录的链接。现在就可以使用~/odoo-dev运行所有的命令,比如前述的 git clone,文件将存放在C:\Users\Public\odoo-dev下。

Git命令中的-b 12.0明确表明要下载 Odoo 12.0分支,在写本文时,这显得有些多余,因为这正是当前默认的分支。–depth=1表示仅下载当前修订版本,而不是所有历史修改记录,这会使下载更快、内容更少。

小贴士:如需在后续下载历史提交内容,可以运行git fetch –unshallow

在运行 Odoo 之前,应安装requirements.txt中所声明的 Python 依赖:

补充:安装时如因requirements.txt指定了Babel==2.3.4而报错,请修改Babel==2.3.4为Babel或 Babel>=2.3.4后再重新执行以上命令;另内存过小也可能导致不易察觉报错,测试时1G 内存报错,调整为2G 后正常安装

这其中的很多依赖都可以通过 Debian 包安装,如python3-lxml,所以使用 apt 包管理器是一个有效的替代方案。这样的优势是在必要时可以自动安装系统依赖,使用的依赖列表可以在./odoo/debian/control中找到。

还有一些requirements.txt中未包含的 Python 包,亦可安装来避免警告或用于开启额外的功能:

小贴士:pip3工具可以通过好几种方式安装:系统包的方式和原生 Python 的方式。如果pip3报了 import error,在系统中重新安装或能解决问题。对应的命令为sudo python3 -m pip uninstall pip && sudo apt install python3-pip –reinstall

现在,通过如下命令可启动 Odoo 实例:

如需停止服务并回到命令行,按下 Ctrl + C。

小贴士:Odoo 10中的修改
现在启动 Odoo的脚本是./odoo-bin,而之前的 Odoo 版本中为./odoo.py

默认Odoo 实例监听8069端口,所以在浏览器中访问http://<server-address>:8069 就可以访问到 Odoo 实例。对于开发者来说,我们会需要使用到多个数据库,所以在命令行中创建会更为方便,后面会介绍如何实现。现在在命令行终端中按下Ctrl + C 停止 Odoo 服务并回到命令行。

初始化新的 Odoo 数据库

要按照 Odoo 的数据模式创建和初始化 Odoo 数据库,我们应使用-d 参数运行 Odoo 服务:

初始化 testdb 数据库可能要花上一分钟,一般会以Modules loaded的 INFO 日志信息结束。它有可能不是最后一条日志信息,但在倒数三到四行中可以找到。此时,服务器就可以监听用户请求了。

ℹ️Odoo 9中的修改
从 Odoo 9开始,如果数据库不存在会被自动创建。但在 Odoo 8中并非如此,需使用PostgreSQL命令行中的createdb命令手动创建

默认情况下,数据库初始化时会带有演示数据,作为开发数据库这通常很有用。相当于在前端创建数据库时勾选了Load demonstration data。如在初始化时无需带有演示数据,在命令行中添加–without-demo=all。

小贴士:在写本文时Ubuntu WSL中有一个针对 PostgreSQL 的问题,该环境下无法新建空数据库。一个解决方案是手动通过createdb 12-library命令创建空数据库。这样会重复提示WARNING: could not flush dirty data: Function not implemented。虽然存在警告信息,但数据库正常创建了。按下Ctrl + C停止警告,使用命令行即可启动 Odoo 并初始化数据库。

当前用户需要是 PostgreSQL 的超级用户才能创建新数据库,前文中在安装过程中已经进行相关操作。

小贴士:对于开发环境,使用数据库超级用户来运行 Odoo 实例毫无问题。但在生产环境中,Odoo最佳安全实践推荐不要使用数据库超级用户权限的用户来运行生产实例。

Odoo 实例已经运行起来了,现在我们可以通过http://<server-name>:8069在浏览器中进行访问。这时会出现登录界面,如果不知道主机名可以通过 hostname 命令查看或通过 ifconfig 查看 IP 地址。默认管理员的用户名和密码均为 admin。登录后即可看到 Apps菜单,及可安装的应用。

在命令终端中按下Ctrl + C可以停止 Odoo 服务实例并回到命令行。按下上方向键可以回到上一条命令,这样可以通过同样的命令再次快速启动 Odoo。

Odoo 12开发之开发环境准备

管理 Odoo 数据库

前面我们学习了如何通过命令行创建和初始化 Odoo 数据库。管理数据库还有更多的命令值得我们学习。虽然 Odoo 服务可以自动地进行数据库管理,我们还是可以使用如下命令来手动创建 PostgreSQL 数据库:

更有趣的是,Odoo 可以通过–template 参数拷贝已有数据库来创建新的数据库。要进行这一操作,被拷贝的数据库不能被连接,所以要确保 Odoo 实例已停止并且没有其它应用连接该数据库。命令如下:

事实上,每当创建数据库时都会使用一个模板,如果没有指定模板,会使用一个名为 template1的预设模板。

要在系统中列出已有数据库,需要使用 PostgreSQL 的 psql 工具及-l 参数:

执行上述命令会列出我们截至目前所创建的数据库。如果执行了前述操作,可以看到列表中有MyDB和MyDB2。列表中还会显示 每个数据库所使用的编码,默认为UTF-8,这也是 Odoo 所需要的数据库编码。

如需删除数据库,执行dropdb命令:

现在我们已学习了数据库的基本知识。要了解更多 PostgreSQL请参见官方文档PostgreSQL使用汇总

警告:dropdb操作是不可撤销的,在对重要数据库执行该命令时请务必备份数据库

其它服务器配置项

Odoo 服务还支持一些其它参数,可通过–help 来查看更多参数:

我们在下面的部分将会学习一些重要参数,首先我们先学习下如何把当前使用参数保存到配置文件中。

Odoo 服务配置文件

大多数的参数都可以保存到配置文件中。默认 Odoo 使用.odoorc文件。Linux 系统中缺省的路径是在家目录($HOME)中,而在 Windows 中则和运行 Odoo 的可执行文件放在同一个目录中。

ℹ️在老版本的 Odoo/OpenERP 中,默认的配置文件为.openerp-serverrc,为保持向后兼容,存在该文件且没有.odoorc文件的情况下会使用该文件。

一个全新安装中不会自动创建.odoorc配置文件,我们应使用–save参数来保存,如果配置文件不存在则会创建默认配置文件:

此处我们还使用–stop-after-init参数以在执行结束后停止服务。这一参数常在运行测试或要求运行模块升级来检测是否正确安装时使用。

小贴士:命令行参数可以缩短到保持不混淆的程度,如–stop-after-init可缩写为–stop。

现在可以通过如下命令来查看缺省配置文件:

以上命令会显示所有配置项及配认值,编辑文件后在下一次启动 Odoo 实例后生效,输入 q 回到命令行。

我们还可以使用–conf(或-c)参数来指定配置文件。配置文件无需包含所有配置项,仅包含需修改默认值的配置项即可。

修改监听端口

–http-port=(或-p)参数可以修改实例的监听端口(默认端口8069),不同的端口可以让我们在同一台机器上运行多个实例。

Odoo 11的修改:在 Odoo 11中引入–http-port参数以替代此前版本使用的–xmlrpc-port

下面就可以做个尝试,打开两个终端,第一个中输入

第二个中输入

此时就在同一台机器上使用不同端口运行了两个 Odoo 实例,这两个实例可以使用同一个数据库或不同数据库。这取决于我们使用的配置参数,并且两个端口上也可以运行相同或不同版本的 Odoo。

小贴士:不同 Odoo 版本必须使用不同的数据库。尝试在不同版本上使用相同数据库将无法正常运行,因为各大版本采用了不兼容的数据库模式。

数据库选项

进行 Odoo 开发时,经常会使用多个数据库,有时还会用到不同版本。在同一端口上停止、启动不同服务实例,或在不同数据库间切换,会导致网页客户端会话异常。因为浏览器会存储会话的 Cookie。

在浏览器中使用私有模式访问实例可以避免这一问题。另一优良实践是在服务实例上开启数据库过滤器,这样可以确保实例仅允许对指定数据库的请求,而忽略其它请求。

Odoo 11中的修改:
从Odoo 11开始,–database(或-d)参数可接收逗号分隔的多个数据库名,设置–database参数时也会自动设置–db-filter参数,这样仅有这个数据库才能为服务实例使用。对于 Odoo 11之前的版本,我们需要使用–db-filter来限制可访问的数据库。

–db-filter可限制 Odoo 实例所能使用的数据库。它接收一个正则表达式来过滤可用数据库名,要精确匹配一个名称,表达式需要以^开头并以$结束。例如,仅允许testdb数据库,我们可以使用如下命令:

使用–database和–db-filter参数来匹配同一数据库是一个良好的实践。事实上从 Odoo 11开始默认会为–database设置对应的–db-filter。

管理服务器日志消息

–log-level 参数可用于设置日志级别,这有助于了解服务的状况。例如要开始调试日志级别,使用–log-level=debug参数。还有如下选项:

  • debug_sql:查看服务中产生的 SQL 查询
  • debug_rpc:服务器接收到的请求详情
  • debug_rpc_answer:服务器发送的响应详情

其实–log-level是设置Odoo 日志级别的简化方式,此外通过更完整的–log-handler参数可以有选择地打开/关闭日志记录器。默认情况下日志会作为标准输出(打印到屏幕),但是可以通过logfile=参数来指定日志存储文件。

安装第三方插件

在 Odoo 实例中产生新的模块并安装,对于初学者总会容易搞不清。下面一起来熟悉这一点。

查找社区模块

网络上有很多 Odoo 模块,Odoo应用商店可以下载一系列模块安装到系统中。另一个重要的资源是Odoo 社区联盟(OCA – Odoo Community Association)维护的模块,可在 GitHub 上查找。OCA 是一个协调社区贡献的非营利组织,它同时提升软件质量,推广最佳开发实践和开源价值观。可通过https://odoo-community.org/来进一步了解 OCA。

为 Odoo 添加模块,仅需将其拷贝到官方插件的 addons 文件夹中即可,按前述安装即为~/odoo-dev/odoo/addons/。但这不是一个好的实践,我们安装的 Odoo 是由 Git 版本控制的代码仓库,将会与上游 GitHub 仓库保持同步,在其中加入外部插件会不利于管理。

避免这一点,我们可以选取一个或多个存放模块的目录,让 Odoo 服务也会从该目录中查找模块来使用。我们不仅可以把自定义模块放在一个不同的目录下不与官方的混在一起,还可以通过不同目录组织这些模块。

我们可以通过下载系统课程的代码来准备供 Odoo 安装的插件模块,获取 GitHub 上的源码,执行如下命令:

此时与/odoo同级的/library文件夹中将包含一些模块,现在就需告知 Odoo 这个新的模块目录。

配置插件(add-ons)路径

Odoo 服务有一个addons_path参数可设置查找插件的路径,默认指向Odoo 服务所运行处的/addons文件夹。我们可以指定多个插件目录,这样就可以把自定义模块放到另一个目录下,无需与官方插件混到一起。

通过如下命令可包含新的模块路径来运行服务:

仔细看服务日志,会发现有一行报告插件路径,信息类似INFO ? odoo: addons paths: […],确认下里面是否有library/目录。

使用 Python 虚拟环境安装 Odoo

维护多个 Odoo 版本的代码在 Odoo 开发中很常见,需要整理一下来保持项目在同一台开发机器上并行。改变版本有时会需要上下文的切换。比如,现在 Odoo 的启动执行文件是odoo-bin,而在老版本中是odoo.py。迁移到 Python 3后又更易混淆了,我们要知道是选择python/pip还是python3/pip3,这取决于使用的 Odoo 版本。

Python 有一个在同机器上管理独立环境的工具virtualenv。每个环境有自己的Python 可执行文件和库文件,仅需在使用时激活环境,然后python和 pip 无需指定就可以在相应的安装了 Python库的环境下运行。要在Debian/Ubuntu上使用virtualenv,执行如下命令:

如果我们使用的工作目录是~/odoo-dev,并把 Odoo 12源代码克隆到~/odoo-dev/odoo目录中,我们可以这样进行虚拟环境的创建:

一旦激活了虚拟环境,我们可以在其中安装 Odoo,可以通过 pip 来进行操作:

以上代码会将~/odoo-dev/odoo中的 Odoo源代码安装到虚拟环境中。-e 参数非常重要,这是一个可编辑安装。它不会复制一份代码到虚拟环境中,仅仅只是保留了一个到原地址 Odoo 代码的引用。因为使用到了源代码,源代码的修改在当前环境中也同样生效。

Odoo 的 Python 依赖会被自动安装,所以无需使用requirements.txt来进行手动安装。我们也可以通过 pip 来安装其它所需的 Python 库:

注意我们无需记住使用的是 Python 2还是 Python 3,这里的pip 命令会指向正确的版本。然后就可以运行 Odoo 了,pip 安装创建了一个bin/odoo命令,可在任何位置运行,无需涉及源代码所在目录。

小贴士:如果决定使用虚拟环境,任何要使用odoo-bin运行的命令,都可以替换为 odoo

以下命令会启动并关闭所安装版本 Odoo,打印一些日志信息用于确定 Odoo 版本和使用的插件:

推荐的操作是将配置文件放在虚拟环境文件夹中。以下会为我们的项目初始化一个12-library 数据库,并创建一个对应的12-library.conf 文件:

自此开始,我们可通过如下命令启动图书项目 Odoo 服务:

最后在完成后,通过如下命令来退出环境:

假设我们要在同一台机器上使用 Odoo 10项目,它使用的是 Python 2.7,通过如下命令创建环境、安装 Odoo:

要使得在 Odoo 版本间切换更容易,我们可以在~/odoo-dev/odoo10目录下再为10.0分支克隆一份源代码。然后创建虚拟环境,激活环境,使用 pip创建一个 Odoo 10可编辑安装。virtualenv没有使用-p 参数指定 Python 版本,默认为 Python 2,也就是 Odoo 10所需的版本。

如果系统中没有 Python 2,Ubuntu 18.04默认就不带 Python 2,则需要执行如下命令来进行安装:

使用 PyPI 下载和安装插件模块

社区贡献的插件可以打包成 Python 库,发布到 Python 包索引(PyPI -Python Package Index),然后像其它库一样使用 pip 安装。为了能使用这一方法,Odoo 自动添加了site-packages/文件夹至插件配置路径,用于安装库文件。打包可以通过setuptools-odoo工具。

OCA 项目使用该工具打包并发布插件至 PyPI。因不同 Odoo 版本中存在相同模块,模块名之前会加一个 Odoo 版本前缀。例如odoo12-addon-partner-fax 是Odoo 12的partner_fax PyPI 包,它为 partner 添加了一个传真字段。

如需从 PyPI 下载该模块及依赖,并随后安装至odoo12env环境,使用如下命令:

服务器端开发者模式

为便于开发者,Odoo 有一个–dev=all参数可激活一些开发者友好的功能。

Odoo 10中的修改:
–dev=…参数是在 Odoo 10中引入的,它取代了此前版本中更简单、功能也更少的–debug参数

这启用了一些有用的功能可加快开发流程,最重要的如下:

  • 在保存 Python 文件时自动重载 Python 代码,避免手动重启服务
  • 从 XML 中直接读取 view 定义,避免手动升级模块

–dev=all将在抛出异常时启动 Python调试器(pdb),在服务报错后做后验(postmortem)分析非常有益。注意这一设置对日志输出不产生任何影响。有关 Python 调试器命令详情可参见Python 官方文档

虽然 all 值适用于大多数情况,–dev还可接一串逗号分隔的选项。缺省情况下会使用Python 调试器 pdb。有些人会倾向安装、使用其它调试器,来改善功能和易用性。Odoo 是允许我们指定调试器的,常用的有ipdb和pudb。在本系列第八篇Odoo 12开发之业务逻辑 – 业务流程的支持中,我们将介绍如何在 Odoo 开发中使用调试器。

要自动侦测代码文件的变化 ,服务开发者模式需安装一个额外的依赖python3-watchdog。我们需要在Ubuntu/Debian系统中安装它之后才可使用,命令如下:

对于 Odoo 11之前的版本,使用的是 Python 2,则需安装python-watchdog。同样可使用 pip 安装,命令为pip install watchdog。

总结

在本文中,如们学习了如何在 Ubuntu 系统中安装 Odoo 并从 GitHub 上获取 Odoo源码,以及如何创建Odoo 数据库和运行 Odoo 实例。

现在我们的 Odoo 环境可正常用于开发,并且也可以对数据库和实例进行管理。有了这些,我们可以进行一步的学习了。在下一篇文章中,我们将从零开始创建第一个 Odoo 模块,并理解相关的主要元素。

 

☞☞☞ 接下来请学习Odoo 12 开发之创建第一个 Odoo 应用

喜欢 (9)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(3)个小伙伴在吐槽
  1. 厉害,谢谢你的分享
    干柿鬼鲛2019-08-01 15:41 回复
  2. 如需在后续下载历史提交内容,可以运行git fetch – -unshallow这里有个笔误,--unshallow,原谅我这个强迫症。
    向往2019-06-23 22:31 回复
  3. 写的太棒了。