Hugo 生成的站点默认位于站点路径下的 public 文件夹,即 site-path\public。在站点路径下新建一个用于部署的文件夹,如 site-path\.deploy,这个文件夹下包含 PowerShell 部署脚本 deploy.ps1 和 Git 仓库 git-repo。hugo server 生成站点后执行 deploy.ps1 即可自动复制新生成的站点文件到仓库并且推送到远端 Git 服务器。

PowerShell 有一组定义脚本行为的变量,其中 $ErrorActionPreference 告诉 PowerShell 脚本执行出错时(如设定的路径不存在)如何处理,其默认值为 Continue 即显示错误信息然后继续执行。需要将 $ErrorActionPreference 设置为 Stop 即显示错误信息然后停止执行,这样可以避免对文件和仓库造成不必要的改变。Set-Location 是设定工作路径,脚本后续的相对路径都是以工作路径为参考,和脚本文件的存放位置无关。部署脚本的工作路径是仓库路径。

$ErrorActionPreference = "Stop"
Set-Location -Path "site-path\.deploy\git-repo"

接下来是执行部署任务:更新站点文件,推送到服务器,清理文件。不过在此之前可以先等待输入提交信息(commit message,默认为当天日期),这样做是可以让部署有挽回的余地,不想部署直接关掉 PowerShell 命令行窗口即可,不会对文件和仓库做任何变动。

$message_default = Get-Date -Format "yyyy-MM-dd"
$message_commit = Read-Host -Prompt "commit message ($message_default)"
if (!$message_commit) {
    $message_commit = $message_default
}

然后是更新站点文件,删除原文件再复制新生成的站点文件到仓库。再提交所有变动并推送到远端服务器,git push 会提示输入账号密码(密码不可见)。最后清理生成的站点文件,删除 public 文件夹。下面是完整的 PowerShell 部署脚本 deploy.ps1

$ErrorActionPreference = "Stop"
Set-Location -Path "site-path\.deploy\git-repo"

# commit message, defaults to the date of today
$message_default = Get-Date -Format "yyyy-MM-dd"
$message_commit = Read-Host -Prompt "commit message ($message_default)"
if (!$message_commit) {
    $message_commit = $message_default
}

# copy newer site files
Remove-Item * -Exclude ".git" -Recurse
Copy-Item -Path "..\..\public\*" . -Recurse

# commit and push
git add -A
git commit -m $message_commit
git push origin master

# clean local site files
Remove-Item -Path "..\..\public" -Recurse

右键点击 deploy.ps1 选择“Run with PowerShell”即可运行脚本执行部署任务。不过,如果你的机器从没运行过 PowerShell 脚本,你可能会看到类似的错误提示“… xxx.ps1 cannot be loaded because running scripts is disabled on this system. …”

这是因为 Windows(客户端版本)的脚本执行策略默认关闭了脚本的执行,以管理员身份在 PowerShell 里将执行策略设置为 RemoteSigned 即可,这个值也是服务器版本 Windows 的默认设置,详细信息可以在这里查看

Set-ExecutionPolicy RemoteSigned