14

我在做什么我认为应该相当简单,但我似乎无法弄清楚如何让它工作。

我想在 html 和 javascript 文件中嵌入一个唯一的版本号,原因有两个。第一个原因是我想确保在加载 javascript 文件时,如果有新版本,系统不会尝试使用缓存,但如果我可以使用类似的方法调用它

 <script src="/app.js?v1.0.1-1-95425234"></script>

我几乎可以肯定地确保这永远不会发生。第二个原因是我的远程错误日志记录,最好知道系统的哪个版本有错误,以便我可以考虑适当地修复它,但不必在每次部署时手动更新此版本号。

一路上遇到git describe了,我觉得它的输出值真的很适合这个。

基本上我想在我的 javascript 和 html 文件中取一个键,GIT-CURRENT-VERSION并将其替换为git describe

我在我的部署方法中使用了fabric,所以在我们获取了最新版本的git之后,在服务器端这样做会很有意义。

我怀疑sedandgrep的某种组合在这里可以解决问题,如果我能为此找出一个衬里,那么添加到我的部署脚本中将非常容易。

提前致谢!

4

3 回答 3

9

我从来没有听说过fabric,但如果面料使用(或调用)git archive,那么你可以使用gitattributes. 也就是说,您可以让您的 HTML 文件包含以下内容:

<script src="/app.js?$Format:%H$"></script>

.gitattributes存储库的顶部:

*.html    export-subst

然后,每当您使用 , 创建存档时git-archive$Format:%H$都会被提交的哈希替换。您可以使用--pretty-formatin中可用的任何内容git-log

查看手册gitattributes,或者更好:Pro Git书的8.2 自定义 Git - Git 属性一章以获得更多想法。

于 2012-10-13T22:28:03.207 回答
5

您可以从部署的 git 树的根目录执行以下操作:

export VERSION="$(git describe)"
find . -type f -print0 | xargs -0 sed -i "s/GIT-CURRENT-VERSION/$VERSION/g"

(这只是粗略的测试——谨慎使用。)

请注意,这将使您的树进行本地修改。

于 2012-10-13T20:40:33.053 回答
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 手册页

接下来,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

在我的情况下,这很好用,因为我使用结构部署到服务器,并且因为我希望更改实时发生,所以我所做的是更新存储库,然后将其复制到新的部署中系统。一旦系统准备就绪,我会删除 git 数据文件,将其保留为常规数据结构。现在我可以告诉系统使用新版本,一切准备就绪。

希望能帮助其他希望实现类似目标的人!

于 2012-10-30T03:46:08.150 回答