0%

整体流程为:STM32CubeMX生成工程模板,VSCode编辑和调试程序,Make启动编译,ARM GCC编译程序,OpenOCD连接调试器。

下载安装Java运行环境

适用于 Windows 的 32 位 Java
适用于 Windows 的 64 位 Java

下载安装STM32CubeMX

下载 OpenOCD for Windows

下载后的文件不是安装包,把程序文件夹放入自己的软件安装目录下,将软件的bin文件夹路径加入用户环境变量PATH中。 如:

C:\ARM\OpenOCD\bin
# 运行以下命令验证
openocd -v

下载安装 arm-none-eabi-gcc

正常安装,安装后需要将软件的安装目录下的bin文件夹设置进入环境变量PATH中。 如:

C:\ARM\gcc-arm-none-eabi\9 2019-q4-major\bin
# 运行以下命令验证
arm-none-eabi-gcc -v

下载 make

下载文件选择Complete package, except sources。将bin文件夹设置进入环境变量PATH中。 如:

C:\ARM\GnuWin32\bin
# 运行以下命令验证
make -v

VSCode安装C/C++、ARM、Cortex-Debug、Cortex-Debug: Device Support Pack - STM32F1插件

另外,还可以用Git Bash替代cmd,点击 文件 -> 首选项 -> 设置,来打开 VS Code 的配置文件( VS Code 采用 json 格式的文件进行配置,没有图形界面),在文件中加入如下配置,尤其注意最后两项执行程序的路径要设到自己的路径下:

1
2
3
4
5
6
7
8
9
10
{
"editor.detectIndentation": false,
"git.ignoreMissingGitWarning": true,
"files.autoGuessEncoding": true,
"editor.formatOnSave": true,
"editor.formatOnPaste": true,
"editor.formatOnType": true,
"terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",
"terminal.external.windowsExec": "C:\\Program Files\\Git\\bin\\bash.exe",
}

然后我们我们重启程序加载配置,而后点击 查看 -> 终端 可以看到 VS Code 的内部终端已经改变为 MINGW64 的终端。

第一个工程

使用STM32CubeMX生成一个Makefile工程,用VSCode添加工程文件夹到工作区,写个Led闪烁的程序。打开终端,终端输入make -j4(-j4指定4线程编译,提高速度)

然后创建.vscode文件夹,增加以下3个配置文件

c_cpp_properties.json

用于设定工程的 Include 路径,宏定义及搜索浏览路径,其中需要设定三个参数:

1 includePath 提供.h的搜索目录
2 defines 编译时在指令中加入的宏定义
3 path 使用右键或ctrl追踪函数实现时搜索的目录

实际上我们只需要配置launch.json文件就可以实现全部的调试功能,但是由于vscode不会自动识别makefile中的配置参数,所以如果想要使其代码索引,智能感知运行正确的话,就需要我们单独设置其中的c_cpp_properties.json文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"C:/ARM/gcc-arm-none-eabi/9 2019-q4-major/arm-none-eabi/include",
"C:/ARM/gcc-arm-none-eabi/9 2019-q4-major/arm-none-eabi/include/c++/9.2.1",
"C:/ARM/gcc-arm-none-eabi/9 2019-q4-major/arm-none-eabi/include/c++/9.2.1/backward",
"C:/ARM/gcc-arm-none-eabi/9 2019-q4-major/lib/gcc/arm-none-eabi/9.2.1/include",
"C:/ARM/gcc-arm-none-eabi/9 2019-q4-major/lib/gcc/arm-none-eabi/9.2.1/include-fixed",
"Drivers/CMSIS/Include",
"Drivers/CMSIS/Device/ST/STM32F1xx/Include",
"Drivers/STM32F1xx_HAL_Driver/Inc",
"Drivers/STM32F1xx_HAL_Driver/Inc/Legacy",
"Drivers/STM32F1xx_HAL_Driver/Src",
"Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc",
"Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src",
"Middlewares/ST/STM32_USB_Device_Library/Core/Inc",
"Middlewares/ST/STM32_USB_Device_Library/Core/Src",
"Inc",
"Src"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE",
"STM32F103xB"
],
"intelliSenseMode": "msvc-x64"
}
],
"version": 4
}

tasks.json

配置build命令,build命令用来生成可执行文件(.elf、.hex)
配置clean命令,clean命令用来清除build过程的中间文件以及build目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"version": "2.0.0",
"tasks": [
{
"label": "clean",
"type": "shell",
"command": "make clean",
},
{
"label": "build",
"type": "shell",
"command": "make -j4"
}
]
}

点击终端运行任务,建立task.json之后会看到两个task,build和clean

launch.json

cwd : current working directory for finding dependencies and other files
request: the request type of this launch configuration.
executable:被调试文件的路径
svdFile:根据芯片的型号在插件目录下进行选择
servertype:调试类型
configFiles:openocd的interface和target目录下进行选择
preLaunchTask:运行调试之后先运行task命令生成elf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"cwd": "${workspaceRoot}",
"executable": "${workspaceFolder}/build/${workspaceRootFolderName}.elf",
"request": "launch",
"type": "cortex-debug",
"svdFile": "C:/Users/will/.vscode/extensions/marus25.cortex-debug-dp-stm32f1-1.0.0/data/STM32F103xx.svd",
"servertype": "openocd",
"configFiles": [
"interface/stlink-v2.cfg",
"target/stm32f1x_stlink.cfg"
],
"preLaunchTask": "build"
}
]
}

注意我用的调试器为stlink-v2,器件为stm32f1x,需要根据调试器和器件做适当的修改

启动调试

直接F5启动调试即可,启动调试时会自动编译并打开OpenOCD服务。设置断点,继续F5调试。

先停止程序再退出调试,否则会影响第二次调试。

添加需编译的文件:在Makefile文件里,c文件在C_SOURCES下照着其它文件的路径格式写,h文件在C_INCLUDES下照着其它文件的路径格式写。

去除需编译的文件:把Makefile文件里的头文件和源文件路径删掉,再把生成的build文件夹删掉,再重新编译。

使Makefile支持C++(未验证):

Makefile文件更改如下:

增加:
CXX_SOURCES =
Src/File.cpp #所有的cpp文件都写在这
CXX = $(GCC_PATH)/$(PREFIX)g++和CXX = $(PREFIX)g++
CXXFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
CXXFLAGS += -g -gdwarf-2
CXXFLAGS += -MMD -MP -MF”$(@:%.o=%.d)”

修改:LDFLAGS = $(MCU) -specs=nano.specs -specs=nosys.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,–cref -Wl,–gc-sections #在-specs=nano.specs后面加-specs=nosys.specs。删除-specs=nano.specs可使用异常捕获等语法,但会使RAM增加约2KB,ROM增加约54KB

增加:
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(CXX_SOURCES:.cpp=.o)))
vpath %.cpp $(sort $(dir $(CXX_SOURCES)))
$(BUILD_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)
$(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.cpp=.lst)) $< -o $@

修改:
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
$(CXX) $(OBJECTS) $(LDFLAGS) -o $@ #用CXX替换原来的CC
$(SZ) $@

main.c不用改成main.cpp,只需把main.c要用的cpp文件里的函数改成C接口,在main.c里用extern void F(void);声明函数后即可使用。这些在cpp文件里被设为C接口的函数不能在cpp文件的h文件里直接声明。

frps服务器

找到外网服务器,有公网IP可以自己搭建,我使用 https://waiwang.men/ 提供的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
地址:aliyunsz.waiwang.men
特权端口:6666
Xtcp端口:6667
监控端口:7777
特权密码:waiwang.men
监控账户:waiwang.men
监控密码:waiwang.men
免费域名:*.aliyunsz.waiwang.men
单用户映射数:5
服务端版本:0.29.1
服务器宽带:独享5M
服务器流量:单向1T
支持: 88,8443,35000-50000端口穿透
服务器定时重启:每周1凌晨3点
服务器由WaiWang.Men官方提供

安装frpc

container中搜索frpc,我选择leonismoe/frpc:v0.29.1,注意frpc版本要与服务器版本一致
1 看到执行的命令为:/frpc -c /etc/frpc.ini
2 设置成自动启动,CPU和内存设置为最低
3 点开高级设置,网络模式选择Host
4 创建frpc.ini存放路径,我使用得是:/share/Document/frpc
5 设置共享文件夹/etc为:/share/Document/frpc
6 点击创建完成frpc的准备

配置frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[common]
server_addr = aliyunsz.waiwang.men
server_port = 6666
token = waiwang.men

[xxx]
type = https # 也可以是http
local_ip = 192.168.0.100 # QNAP本地IP
local_port = 443 # QNAP提供服务的端口号
custom_domains = xxx.aliyunsz.waiwang.men # xxx为自定义子域名,有自己的域名可以替代成自己的

[xxx]
type = https
local_ip = 192.168.0.100
local_port = 5001
custom_domains = xxx.aliyunsz.waiwang.men

[xxx]
type = tcp
local_ip = 192.168.0.100
local_port = 22
remote_port = xxx # 35000-50000之间

xxx为自定义
重启frpc,在控制台中看到xxx start proxy success即说明穿透成功
访问: https://xxx.aliyunsz.waiwang.men:8443 (如果是http服务则是88)

frps服务器

临时更换源

pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple

永久更换源

用notepad++创建pip.ini文件,保存位置为:
%USERPROFILE%\AppData\Roaming\pip\pip.ini

内容为:

1
2
3
4
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com

升级pip

python -m pip install --upgrade pip

附【国内镜像】
中国科学技术大学 : https://pypi.mirrors.ustc.edu.cn/simple
清华:https://pypi.tuna.tsinghua.edu.cn/simple
豆瓣:http://pypi.douban.com/simple/
华中理工大学 : http://pypi.hustunique.com/simple
山东理工大学 : http://pypi.sdutlinux.org/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/

步骤概览:
1、网络安装wheel、pyWin32
2、本地安装lxml;lxml下载地址
3、本地安装pyWin32;pyWin32下载地址
4、本地安装Twisted;Twisted下载地址
5、网络安装Scrapy;

1、网络安装wheel(实际发现pyWin32、lxml也可以网络安装)

用管理员身份打开cmd > 输入

pip install wheel
pip install pyWin32
pip install lxml

2、本地安装Twisted(网络安装过程中出错,没有详细研究)

pip install xxx.whl

3、网络安装Scrapy

以管路员身份打开cmd > 输入

pip install scrapy

问题背景:

outlook 卸载重装后,会把之前已收的邮件,再次下载到本地,出现大量重复邮件。

解决思路:

搜索outlook邮件删除重复邮件的工具,有outlook duplicate items remover,Duplicate Email Remover,NoMoreDupes for Outlook等。但这些工具都要收费。故换了个思路,用宏来删除。

使用要点:

打开outlook,按快捷键Alt+F11,建立工程,并复制宏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Option Explicit

Sub DeleteDuplicateEmailsInSelectedFolder()

Dim i As Long
Dim n As Long
Dim DeletedCount As Long
Dim Message As String
Dim Items As Object
Dim AppOL As Object
Dim NS As Object
Dim Folder As Object

Set Items = CreateObject("Scripting.Dictionary")

'Initialize and instance of Outlook
Set AppOL = CreateObject("Outlook.Application")

'Get the MAPI Name Space
Set NS = AppOL.GetNamespace("MAPI")

'Allow the user to select a folder in Outlook
Set Folder = NS.PickFolder

'Get the count of the number of emails in the folder
n = Folder.Items.Count

'Set the initial deleted count
DeletedCount = 0

'Check each email starting from the last and working backwards to 1
'Loop backwards to ensure that the deleting of the emails does not interfere with subsequent items in the loop
For i = n To 1 Step -1

On Error Resume Next
'Load the matching criteria to a variable
'This is setup to use the Sunject and Body, additional criteria could be added if desired
Message = Folder.Items(i).Subject & "|" & Folder.Items(i).Body

'Check a dictionary variable for a match
If Items.Exists(Message) = True Then
'If the item has previously been added then delete this duplicate
Folder.Items(i).Delete
DeletedCount = DeletedCount + 1
Else
'In the item has not been added then add it now so subsequent matches will be deleted
Items.Add Message, True
End If

Next i

ExitSub:

'Release the object variables from memory
Set Folder = Nothing
Set NS = Nothing
Set AppOL = Nothing

MsgBox "共删除" & DeletedCount & "封邮件。"

End Sub

然后F5运行此宏即可,如果提示宏被禁用,主菜单中文件->选项->信任中心,信任中心设置->宏设置,选择“启动所有宏”或者“为所有宏提供通知”。亲测Outlook2013有效,运行时需耐心等待。

假设你的移动硬盘在windows下显示为 F:\

1.新建文件夹f

sudo mkdir /mnt/f

2.挂载盘符f

sudo mount -t drvfs F: /mnt/f

3.大功告成。进入/mnt/f即可与windows下一摸一样。

4.弹出移动硬盘,这样才能在windows下正常弹出,否则是会一直占用的。

sudo umount /mnt/f

安装Aria2

opkg update
opkg install aria2
aria2c -v

安装成功后会打印以下信息

aria2 version 1.33.0

Copyright (C) 2006, 2017 Tatsuhiro Tsujikawa

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

** Configuration **
Enabled Features: BitTorrent, GZip, HTTPS, Message Digest, Metalink, XML-RPC, SFTP
Hash Algorithms: sha-1, sha-224, sha-256, sha-384, sha-512, md5, adler32
Libraries: zlib/1.2.11 libxml2/2.9.7 OpenSSL/1.0.2n libssh2/1.7.0
Compiler: gcc 6.3.0
built by  x86_64-pc-linux-gnu
targeting x86_64-openwrt-linux-gnu
on        Jan 11 2018 07:55:53

System: Linux 4.14.24-qnap #1 SMP Fri Feb 14 09:52:34 CST 2020 x86_64

Report bugs to https://github.com/aria2/aria2/issues
Visit https://aria2.github.io/

By default, Aria2 is configured to start as a daemon, download any content to /opt/var/aria2/torrents, listen RPC control port 6800, which can be accessed with Passw0rd token. You can change this settings in /opt/etc/aria2.conf if necessary.

修改配置

vim /opt/etc/aria2.conf

配置文件说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
## 文件保存相关 ##

# 文件保存目录
dir=/home/naonao/Downloads
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
disk-cache=32M
# 断点续传
continue=true

# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: none < falloc ? trunc < prealloc
# falloc和trunc则需要文件系统和内核支持
# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
file-allocation=trunc

## 下载连接相关 ##

# 最大同时下载任务数, 运行时可修改, 默认:5
#max-concurrent-downloads=100
# 同一服务器连接数, 添加时可指定, 默认:1
# 官方的aria2最高设置为16, 如果需要设置任意数值请重新编译aria2
max-connection-per-server=256
# 整体下载速度限制, 运行时可修改, 默认:0(不限制)
#max-overall-download-limit=0
# 单个任务下载速度限制, 默认:0(不限制)
#max-download-limit=0
# 整体上传速度限制, 运行时可修改, 默认:0(不限制)
#max-overall-upload-limit=0
# 单个任务上传速度限制, 默认:0(不限制)
#max-upload-limit=0
# 禁用IPv6, 默认:false
# disable-ipv6=true

# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=10M
# 单个任务最大线程数, 添加时可指定, 默认:5
# 建议同max-connection-per-server设置为相同值
split=256

## 进度保存相关 ##

# 从会话文件中读取下载任务
input-file=/etc/aria2/aria2.session
# 在Aria2退出时保存错误的、未完成的下载任务到会话文件
save-session=/etc/aria2/aria2.session
# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
save-session-interval=60

## RPC相关设置 ##

# 启用RPC, 默认:false
enable-rpc=true
# 允许所有来源, 默认:false
rpc-allow-origin-all=true
# 允许外部访问, 默认:false
rpc-listen-all=true
# RPC端口, 仅当默认端口被占用时修改
# rpc-listen-port=6800
# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
rpc-secret=yourpassword
# 启动SSL
# rpc-secure=true
# 证书文件, 如果启用SSL则需要配置证书文件, 例如用https连接aria2
# rpc-certificate=
# rpc-private-key=

## BT/PT下载相关 ##

# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
follow-torrent=true
# 客户端伪装, PT需要
peer-id-prefix=-TR2770-
user-agent=Transmission/2.77
# 强制保存会话, 即使任务已经完成, 默认:false
# 较新的版本开启后会在任务完成后依然保留.aria2文件
#force-save=false
# 继续之前的BT任务时, 无需再次校验, 默认:false
bt-seed-unverified=true
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
# bt-save-metadata=true
# 单个种子最大连接数, 默认:55 0表示不限制
bt-max-peers=0
# 最小做种时间, 单位:分
# seed-time = 60
# 分离做种任务
bt-detach-seed-only=true

启动

/opt/etc/init.d/S81aria2 start

关闭

/opt/etc/init.d/S81aria2 stop

下载文件

aria2c xxx -d dir

如果下载遇到以下错误:

[SocketCore.cc:1015] errorCode=1 SSL/TLS handshake failure: unable to get local issuer certificate

请安装以下软件:

opkg install ca-certificates

安装WebUI

Aria2 WebUI by @ziahamza
YAAW WebUI by @binux

下载Aria2 WebUI,然后解压到Web目录,文件夹命名为aria2,然后访问 http://xxx.xxx.xxx.xxx/aria2 即可

参考 https://github.com/Entware/Entware-ng/wiki/Using-Aria2

安装Git

opkg update
opkg install git

初始化git服务器端仓库,git仓库务必存放在非系统自带的目录下,否则系统重启之后数据会被抹掉

cd /share/CACHEDEV1_DATA
mkdir git
cd git
git init --bare python.git

为NAS添加名称为git的用户和用户群,用于所有的git仓库访问。这里最好通过NAS自带的WEB界面创建用户和用户群,且git用户无需其他目录的权限。创建之后,通过WEB界面使用git用户进行登陆,这样NAS系统会自动设置好git用户的默认目录(这个目录是/share/homes/git)。

更改git仓库目录的所有者为git用户。运行如下命令:

chown -R git:git python.git

通过应用商店安装

安装应用商店里面的python3之后,没有任何作用。
通过shell链接到NAS上找到安装包的位置

1
2
3
[~] # cat /share/CACHEDEV1_DATA/.qpkg/Python3/README.md
Run the following command to enter Python3 environment:
$ . /etc/profile.d/python3.bash

有可能会报告没有运行权限

1
2
[~] # ls -als /etc/profile.d/python3.bash
0 lrwxrwxrwx 1 admin administ 48 Feb 9 12:54 /etc/profile.d/python3.bash -> /share/CACHEDEV1_DATA/.qpkg/Python3/python3.bash

执行如下命令添加权限即可

1
2
[~] # chmod 744 /share/CACHEDEV1_DATA/.qpkg/Python3/python3.bash
[~] # . /etc/profile.d/python3.bash

但是似乎不能开机就运行这个脚本。每次重新开机都要去再运行一次,但是似乎也不是什么大问题了。

通过Entware-ng安装

1
2
opkg install python3
opkg install python3-pip

pip也可以通过以下命令安装

1
2
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

更换国内源

系统默认的apt源是国外的,下载软件速度慢,python的pip源也很慢,我们都换成阿里云的源。

更换apt源:

cd /etc/apt/sudo
cp sources.list sources.list.bak && sudo vim sources.list

删除其中所有内容(dG),替换成:

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

然后更新

sudo apt update
sudo apt upgrade

更换pip源

安装pip并设置成默认

sudo apt install python3-pip
sudo ln -s /usr/bin/python3 /usr/bin/python
sudo ln -s /usr/bin/pip3 /usr/bin/pip

修改pip源:

mkdir ~/.pip && vi ~/.pip/pip.conf

在打开的vim中输入下文并保存:

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com

准备Hexo环境

安装nodejs及npm

sudo apt update
sudo apt install nodejs
sudo apt install npm

配置npm

npm config set registry https://registry.npm.taobao.org
npm config get registry // 配置后可通过该命令来验证是否成功

安装hexo

npm install hexo-cli -g