我认为我应该做的事情应该相当简单,但我似乎无法弄清楚如何让它发挥作用。
我想在html和javascript文件中嵌入一个唯一的版本号,原因有两个。第一个原因是我想确保在加载javascript文件时,如果有新版本,系统不会尝试使用缓存,但如果我可以使用
之类的东西调用它 <script src="/app.js?v1.0.1-1-95425234"></script>
我几乎肯定能确保这种情况永远不会发生。第二个原因是我的远程错误记录,最好知道哪个版本的系统有错误,这样我就可以适当地修复它,但不必在每次部署时手动更新这个版本号。
我一路上遇到git describe
,我认为它的输出值非常适合这个。
基本上我想在我的javascript和html文件中输入密钥,例如GIT-CURRENT-VERSION
,并将其替换为git describe
的输出
我在部署方法中使用了fabric,所以在我们抓住最新版本的git之后,这在服务器端会很有意义。
我怀疑sed
和grep
的某些组合可以解决这个问题,如果我能找到一个内容,那么添加到我的部署脚本会非常容易。< / p>
提前致谢!
答案 0 :(得分:9)
我从未听说过fabric
,但如果结构使用(或调用)git archive
,那么您可以使用gitattributes
。也就是说,您可以使用以下内容来创建HTML文件:
<script src="/app.js?$Format:%H$"></script>
在存储库顶部的.gitattributes
中:
*.html export-subst
然后,每当您使用git-archive
创建存档时,$Format:%H$
将被提交的哈希替换。您可以使用--pretty-format
中的git-log
提供的任何内容。
查看gitattributes
或更好的手册: 8.2 Customizing Git - Git Attributes 的“Pro Git”一章以获取更多信息想法。
答案 1 :(得分:5)
您可以从已部署的git树的根目录执行以下操作:
export VERSION="$(git describe)"
find . -type f -print0 | xargs -0 sed -i "s/GIT-CURRENT-VERSION/$VERSION/g"
(这只是粗略的测试 - 谨慎使用。)
请注意,这将使您的树进行本地修改。
答案 2 :(得分:1)
沿着guettli的评论,我想我发布了我的最终结果。这是我的解决方案,基于Mark Longair的上述解决方案。
export DESCRIPTION="$(git describe)"
find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0 | xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g"
我会对我在这里做的事情做一点解释。
export DESCRIPTION="$(git describe)"
获取git存储库当前状态的当前描述。有关详细信息,请查看git describe Manual Page。
接下来,find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0
您可以使用您的存储库路径替换[PATH]
。 -regextype posix-extended -regex ".*\.(js|html)"
通过您的目录下降并找到与".*\.(js|html)"
定义的正则表达式匹配的所有文件。就我而言,我知道我只想在javascript或html文件中进行替换。最后xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g"
告诉系统将CURRENT-GIT-DESCRIPTION
替换为上面git describe
定义的值。
在我的情况下,这非常有效,因为我使用fabric来部署到服务器,并且因为我希望实时发生更改,我所做的是更新存储库,然后复制它进入了系统的新部署。一旦系统准备就绪,我就摆脱了git数据文件,将其作为常规数据结构。现在我可以告诉系统使用新的构建,一切都准备好了。
希望能帮助其他人寻求类似的东西!