致谢Timothy Pratley的答案。
我在此基础上增加了更多细节。请参见
https://github.com/deg/clojure-then-you-think/wiki/Static-website-deploy-to-GitHub
但是,由于Stack Overflow的管理员正确地担心离线答案会过时,因此这里提供完整副本,截至目前为止是正确的:
< p >< em >(感谢Timothy Pratley!这些想法基于他的
鞭项目和
Stack Overflow回答)。
许多ClojureScript项目不需要显式的服务器支持。它们要么在浏览器中执行所有操作,要么使用云端现有解决方案作为后端。例如,我的Trilystro玩具项目是前端re-frame浏览器应用程序,并使用Firebase应用程序进行持久存储。
对于这种类型的项目,一种非常简单的部署技术是创建一个GitHub Pages项目页面。成本为零,网站可用性似乎很好(在我的轻微测试中)。
设置
GitHub配置
GitHub的详细说明在该页面上,但步骤非常简单:
- 在GitHub中,进入您项目的Settings|Options。
- 打开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分支中。
简单来说,这很容易:只需执行
lein cljsbuild
并将结果推送到GitHub即可。但细节决定成败。基于Timothy Pratley的想法,我在Trilystro中创建了两个脚本。最新版本在此处:
让我们详细看一下它们:
(当然,请注意,我可能会继续更改这些文件。源代码比下面的副本更准确)
在这些脚本中,Trilystro仍然在一些地方硬编码。您需要搜索并替换为自己的项目。
first-deploy.sh
- 在本地repo之外创建目录结构。这是我们将保留部署站点的工作副本的地方。
- 在本地初始化git仓库
- 添加
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
```
deploy.sh
- 检查项目是否已完全提交。我们将使用 git commit SHA 标记部署,因此我们要避免捕获任何杂散的更改。
- 清理并构建项目。如果发生任何错误,请中止。
- 清理部署目录,然后重建 CNAME 文件并复制编译结果。
- 还需要将有关构建的信息复制到部署中,以一个名为
git-describe.txt
的文件。
- 用描述版本的注释将新版本提交到 GitHub。
```
#!/bin/bash
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
```