[#1] 如何透過 Publish 使用 100 % Swift code 建立 Blog
起源: 2019 年, 接觸了剛起步的 Swift by Sundell, Sundell 是一個全職的作者, 不僅每週有固定的文章與 Podcast, 還不時的在各大 Swift 有關的演講分享, 而在 2019 年 12 月底, Sundell 推出了 Publish
Jhon Sundell @SwiftServerConf, 2019/11
Publish
於 2020 年 1 月 版號是v0.1.0
, 代表 還有不少的功能還沒實現, Sundell 對於新功能是採用PR please
的方式, 也就是不接受 issue, 只接受貢獻, 因此某種程度是更新較慢的.
Publish 框架環境與安裝
- Swift 5.1
- Swift Package manager: swift-tools-version:5.1
- PublishCLI: Publish
v0.1.0
Step 1: 安裝 Publish
git clone https://github.com/JohnSundell/Publish.git
cd Publish
make
透過 MakeFile
, 將安裝 publish-cli
至 /usr/local/bin/
, 就可以使用 publish
Step 2: 靜態網頁建立
mkdir __WEBSITE_NAME__
cd __WEBSITE_NAME__
publish new
透過 PublishCLI
建立 Package.swift
, 之後可以用 XCode 編輯
Publish 整體架構
├── Content/
│ ├── index.md
│ └── posts/
│ ├── first-post.md
│ └── index.md
├── Package.swift
├── Resources/
└── Sources/
└── __WEBSITE_NAME__/
└── main.swift
Publish 框架下使用 SPM
來處理整個由 Read *.md
~> gen *.html, Theme.css
~> Site metadata
的過程, 程式相依資源是由 Package.swift
控制, 分頁的讀取由 main.swift
觸發, 文章的來源是相依從 Content/
取得, 主要設計由 main.swift 的 try SomeWebsite().publish(...)
, 其中包含基本網站的 metaData, building 的介入 等.
import Foundation
import Publish
import Plot
// This type acts as the configuration for your website.
struct Publishdemo: Website {
enum SectionID: String, WebsiteSectionID {
case posts
}
struct ItemMetadata: WebsiteItemMetadata {
// Add any site-specific metadata that you want to use here.
}
// Update these properties to configure your website:
var url = URL(string: "https://your-website-url.com")!
var name = "Publishdemo"
var description = "A description of Publishdemo"
var language: Language { .english }
var imagePath: Path? { nil }
}
try Publishdemo().publish(withTheme: .foundation)
使用 GitHub page 作為 發佈空間
GitHub 在每個賬號下可以有固定一個免費的靜態網站的空間, 原意是可以作為 open source 的 doc 或是基本的 intro, 而作為個人使用賬號, 可以用來作為個人的 blog. 1. 與GitHub 建立一個 repo, 名稱必須是該賬號.github.io
, 這樣才可以被 GitHub 識別. 2. (很重要) 不要對哪個 repo 作任何 push. 3. 與你的 main.swift
內建的.publish(withTheme:)
修改為一下
try MyWebSite().publish(
withTheme: .foundation,
deployedUsing: .git("https://github.com/ytyubox/ytyubox.github.io")
)
- 使用 terminal 指令
publish deploy
直接上傳到 GitHub.