向 Timothy Pratley 致敬,感谢他的回答。
我在它的基础上添加了更多细节。请参阅https://github.com/deg/clojure-then-you-think/wiki/Static-website-deploy-to-GitHub
但是,由于 Stack Overflow 版主担心场外答案会过时,这是正确的,所以这里有一个完整的副本,截至目前是正确的:
(给 Timothy Pratley 的帽子提示!这里的想法是基于他的,来自他的鞭子项目和Stack Overflow 的答案)。
许多 ClojureScript 项目不需要明确的服务器支持。他们要么在浏览器中做所有事情,要么使用基于云的现有解决方案作为后端。一个例子是我的Trilystro玩具项目,它是前端的重新框架浏览器应用程序,并使用Firebase应用程序进行持久存储。
对于这类项目,一个非常简单的部署技术是创建一个GitHub Pages项目页面。成本为零,并且站点可用性似乎很好(在我的非常简单的测试中)。
设置
GitHub配置
GitHub 的详细说明在该页面上,但步骤非常简单: - 在 GitHub 上,进入您的项目设置|选项。- 打开GitHub Pages(靠近选项页面的底部)。- 将已编译的项目部署到项目的 gh-pages 分支。(见下文!) - 您的项目现在将在http:// Your-GITHUB-ID .github.io/ YOUR-GITHUB-REPOSITORY 上可用
- 可选择设置自定义域 - 在选项中添加新 URL 作为自定义域- 在您的 DNS 提供商处,添加指向YOUR-GITHUB-ID .github.io的 CNAME 记录。重要:不要在此处包含存储库名称。(CNAME 必须指向主机,而不是 URL)。- 在已部署项目的根目录中添加一个名为 CNAME 的文件,其中仅包含 URL
Clojure 部署
我们略过了上面的一个关键步骤。您必须编译 ClojureScript 项目并将其放入 GitHub 存储库的 gh-pages 分支。
概括地说,这很容易:只需执行 alein cljsbuild
并将结果推送到 GitHub。一如既往,魔鬼在细节中。基于 Timothy Pratley 的想法,我创建了两个在 Trilystro 中使用的脚本。最新版本在这里:
让我们详细看看它们:( 注意,当然,我将来可能会继续更改这些文件。来源会比下面的副本更准确)
Trilystro 仍然在一些地方硬编码到这些脚本中。您需要搜索和替换您自己的项目。
首次部署.sh
- 在本地 repo 之外创建一个目录结构。这是我们将保留已部署站点的工作副本的地方。
- 在本地初始化一个 git repo
- 添加
CNAME
文件
- 将此 repo 与 GitHub 上的 gh-pages 分支关联
```
#!/bin/bash
DEPLOYDIR=../trilystro-website
mkdir $DEPLOYDIR
pushd $DEPLOYDIR
git init
cat > CNAME <<EOF
trilystro.vuagain.com
EOF
git add .
git commit -m "Initial deploy to GitHub Pages"
git push --force --quiet "git@github.com:deg/trilystro.git" master:gh-pages
git branch gh-pages
git checkout gh-pages
popd
```
部署.sh
- 检查项目是否已完全提交。我们将使用 git commit SHA 标记部署,因此我们希望避免捕获任何杂散更改。
- 清理并构建项目。如果出现任何错误则中止。
- 清理部署目录,然后重建 CNAME 文件并复制到编译结果中。
- 还将有关构建的信息复制到部署中,在一个名为的文件中
git-describe.txt
- 将新版本提交到 GitHub,并附上描述版本的注释
```
#!/bin/bash
# Adapted from https://github.com/timothypratley/whip/blob/master/deploy.sh
# See also https://stackoverflow.com/questions/37667931/how-do-i-deploy-a-single-page-app-written-in-clojurescript-figwheel-to-a-stat
set -e
DEPLOYDIR=../trilystro-website
RED='\033[0;31m'
NOCOLOR='\033[0m'
function die(){
echo -e ${RED}"$1"${NOCOLOR}
exit 1
}
if [ -n "$(git status --untracked-files=no --porcelain)" ]; then
die "Aborting deploy. There are uncommited changes.";
fi
lein clean
lein cljsbuild once min || die "Lein cljsbuild failed!"
GIT_COMMIT=$(git show -s --oneline HEAD)
pushd $DEPLOYDIR
rm -rf *
cp -r ../trilystro/resources/public/* .
cat > CNAME <<EOF
trilystro.vuagain.com
EOF
popd
git describe --always > $DEPLOYDIR/git-describe.txt
git log -1 --format=%cd --date=iso >> $DEPLOYDIR/git-describe.txt
pushd $DEPLOYDIR
git add .
git commit -m "Deploy $GIT_COMMIT"
git push "git@github.com:deg/trilystro.git" gh-pages:gh-pages
popd
```