Hugo Deploy
使用 hugo deploy
命令將您的網站直接部署到 Google Cloud Storage 存儲桶、AWS S3 存儲桶或 Azure 存儲容器。
假設
- 您已經完成 Quick Start 或擁有準備部署並與世界分享的 Hugo 網站。
- 您擁有您希望部署到的服務提供商帳戶 (Google Cloud、AWS 或 Azure)。
- 您已經完成認證。
- Google Cloud: 安裝 CLI 並運行
gcloud auth login
。 - AWS: 安裝 CLI 並運行
aws configure
。 - Azure: 安裝 CLI 並運行
az login
。 - 注意:每個服務都支持其他認證方式,包括使用環境變數。詳情請參見 此處。
- Google Cloud: 安裝 CLI 並運行
- 您已經創建了要部署的存儲桶。如果您希望您的網站為公共網站,請確保將存儲桶配置為可公開讀取靜態網站。
配置您的第一次部署
在您的網站配置文件中,添加 [deployment]
部分和 [[deployment.targets]]
子部分。唯一必需的參數是名稱和 URL:
[deployment]
[[deployment.targets]]
# 為此目標指定一個任意名稱。
name = "production"
# URL 指定要部署到的 Go Cloud Development Kit URL。示例:
URL = "<FILL ME IN>"
# Google Cloud Storage -- 請參見 https://gocloud.dev/howto/blob/#gcs
#URL = "gs://<Bucket Name>"
# Amazon Web Services S3;請參見 https://gocloud.dev/howto/blob/#s3
#URL = "s3://<Bucket Name>?region=<AWS region>"
# 對於 S3 兼容端點,請參見 https://gocloud.dev/howto/blob/#s3-compatible
#URL = "s3://<Bucket Name>?endpoint=https://my.minio.instance&awssdk=v2&use_path_style=true&disable_https=false
# Microsoft Azure Blob Storage;請參見 https://gocloud.dev/howto/blob/#azure
#URL = "azblob://$web"
部署
要將網站部署到目標:
hugo deploy [--target=<target name>]
部署過程會遞歸地瀏覽您的本地發佈目錄(默認為 public
),並將其同步到目標存儲桶,以確保本地和遠程內容相符。
如果您沒有指定目標,Hugo 將會部署到配置中的第一個目標。
請參見 hugo help deploy
或 命令行文檔 了解更多命令行選項。
文件列表如何工作
hugo deploy
首先會通過遍歷本地發佈目錄和遠程存儲桶來創建本地和遠程的文件列表。
對於本地和遠程,文件列表會根據 部署目標的配置 包含或排除文件 –
- 如果配置指定了
include
模式,默認情況下會跳過所有不匹配模式的文件。 - 如果配置指定了
exclude
模式,則會跳過匹配該模式的文件。
本地和遠程文件列表如何比較
第二步,Hugo 比較這兩個文件列表,以找出實際需要在遠程進行的更改。首先比較文件名;如果本地和遠程文件都存在,則比較大小和 md5 值。任何差異意味著該文件將被(重新)上傳。
指定 --force
標誌將確保所有文件重新上傳,即使 Hugo 無法檢測到本地和遠程之間的任何差異。
如果遠程存儲桶中不存在本地文件,則會從遠程存儲桶中刪除相應的文件。
如果使用 --confirm
或 --dryRun
標誌,Hugo 會顯示它所發現的差異,並在此處暫停或停止。
同步是如何工作的
Hugo 將更改列表應用於遠程存儲桶。缺少或已更改的文件將被上傳,缺少本地但在遠程存在的文件將被刪除。在上傳文件時,根據匹配器配置,文件的標頭也會在遠程進行配置。
高級配置
以下是完整的部署配置示例:
[deployment]
# 默認情況下,文件會以任意順序上傳。
# 如果您指定了 `order` 列表,則會先上傳與此列表中正則表達式匹配的文件,並按照指定順序上傳。
order = [".jpg$", ".gif$"]
[[deployment.targets]]
# 定義一個或多個目標,例如,staging 和 production。
# 每個目標都有自己的 [[deployment.targets]] 部分。
# 為此目標指定一個任意名稱。
name = "mydeployment"
# 要部署的 Go Cloud Development Kit URL。示例:
URL = "<FILL ME IN>"
# GCS; 請參見 https://gocloud.dev/howto/blob/#gcs
#URL = "gs://<Bucket Name>"
# S3; 請參見 https://gocloud.dev/howto/blob/#s3
# 對於 S3 兼容端點,請參見 https://gocloud.dev/howto/blob/#s3-compatible
#URL = "s3://<Bucket Name>?region=<AWS region>"
# Azure Blob Storage;請參見 https://gocloud.dev/howto/blob/#azure
#URL = "azblob://$web"
# 您可以使用 "prefix=" 查詢參數來針對存儲桶的子文件夾進行部署:
#URL = "gs://<Bucket Name>?prefix=a/subfolder/"
# 如果您使用的是 CloudFront CDN,部署將根據需要使快取失效。
#cloudFrontDistributionID = "<FILL ME IN>"
# 在部署到此目標時,包含或排除特定文件:
# 如果排除項非空,並且本地或遠程文件的路徑與其匹配,該文件將不會同步。
# 如果包含項非空,並且本地或遠程文件的路徑未匹配,該文件將不會同步。
#
# 註:未通過包含/排除過濾器的本地文件不會上傳到遠程,
# 未通過包含/排除過濾器的遠程文件不會被刪除。
#
#include = "**.html" # 僅包含以 ".html" 為後綴的文件
#exclude = "**.{jpg, png}" # 排除以 ".jpg" 或 ".png" 為後綴的文件
# 將任何名為 "<dir>/index.html" 的文件映射為遠程文件 "<dir>/"
# 這不會影響根目錄的 "index.html" 文件,也不會影響下面的匹配器。
# 這在部署到像 Amazon S3(通用存儲桶,而非目錄存儲桶)、Google Cloud Storage 和
# Azure Blob Storage 這樣的鍵值雲存儲系統時有效。這樣就能使標準 URL 與雲存儲中的對象鍵一致,
# 除了根目錄的 index.html 文件之外。
#
#stripIndexHTML = true
#######################
[[deployment.matchers]]
# 匹配器使指定的文件類型擁有特殊的快取、內容類型和壓縮行為。
# 您可以為每種文件類型添加多個匹配器塊;每個匹配的匹配器都會
```yaml
# 匹配給定文件模式的配置將被使用。
# 請參閱 https://golang.org/pkg/regexp/syntax/ 以了解模式語法。
# 模式搜索會在第一個匹配處停止。
# 此配置不受上方 stripIndexHTML 設定的影響。
pattern = "<FILL ME IN>"
# 如果設為 true,Hugo 會在將文件上傳至存儲桶之前執行 Gzip 壓縮。
# 對於許多存儲服務,這可以節省未壓縮文件類型的存儲和頻寬成本。
#gzip = false
# 如果設為 true,即使文件大小和 MD5 匹配,Hugo 仍會重新上傳該文件。
# 當 Hugo 無法可靠地判斷是否需要重新上傳文件時,這個選項會很有用。
#force = false
# 配置文件在提供時的內容類型(Content-type)標頭。
# 預設情況下,可以根據文件副檔名來確定。
#contentType = ""
# 配置文件在提供時的快取控制(Cache-control)標頭。
# 預設值為空字串。
#cacheControl = ""
# 配置文件在提供時的內容編碼(Content-encoding)標頭。
# 預設情況下,如果 gzip 設為 True,這將被設為 "gzip"。
#contentEncoding = ""
# 示例:
[[deployment.matchers]]
# 將靜態資產緩存 1 年。
pattern = "^.+\\.(js|css|svg|ttf)$"
cacheControl = "max-age=31536000, no-transform, public"
gzip = true
[[deployment.matchers]]
pattern = "^.+\\.(png|jpg)$"
cacheControl = "max-age=31536000, no-transform, public"
gzip = false
[[deployment.matchers]]
# 為 /sitemap.xml 設定自訂的內容類型。
pattern = "^sitemap\\.xml$"
contentType = "application/xml"
gzip = true
[[deployment.matchers]]
pattern = "^.+\\.(html|xml|json)$"
gzip = true