在部署期间,我遇到了资产预编译的问题,所以我选择了本地预编译,并将生成的文件签入到我的源树中。我对这种方法没有任何问题,除了,有时我忘记运行预编译任务和发布而不预编译资产!:(
我想知道是否有人遇到过某种方式来检查是否发生了任何资产变化?理想情况下,我希望在我的CI服务器上运行某种类型的检查,如果还没有提交资产更改,就会失败构建。
我有几个想法:
RAILS_ENV=production bundle exec rake assets:precompile并查看是否有任何输出。(如果资产是最新的,则该命令似乎不会输出任何内容。)但是,似乎命令的输出与它运行的环境有某种联系,因为在本地运行命令、提交结果、然后在CI服务器上运行命令之后,仍然有来自命令的输出!我想知道为什么这与环境有关,但我甚至无法在rails github中找到rake assets:precompile的源代码。有人知道来源在哪里吗?assets/文件夹中发生了更改。不太确定那是怎么回事..。这已经咬了我好几次了,有时候当同事们进行资产变更时,我就抓不到了--而且这看起来真的是一台电脑应该能捕捉到的东西。我想第三个比较合理的选择是让CI服务器简单地运行命令,并将生成的文件自动提交到源树,但我不喜欢CI服务器提交提交的想法。
有什么想法吗?谢谢。
发布于 2015-07-22 10:36:57
您可以在precompile中找到链轮.导轨任务的源。您没有在本地看到任何更改的原因可能是由于指纹,在生产中默认启用指纹,在其他环境中禁用(因为使用指纹进行调试可能会带来麻烦)。您可以使用config.assets.digest启用它,如资产指南中所述。
正如您提到的,很容易忘记预编译步骤。一个优雅的自动化将是从您的回购中删除已编译的资产,并在每个部署中添加一个capistrano (或CI)任务来预编译资产。理想情况下,预编译将发生在CI服务器上(而不是在每个生产服务器上运行它)。这种方法还减轻了继续扫描编译后的资产以获得更改的需要(这是您不应该关心的)。
自动提交任何东西给你的回购是个坏主意--除了不经意的提交,你最终会让你的提交历史变得复杂。
发布于 2015-07-20 01:38:14
我的答案是基于Git的,OP思想2的一个实现:我们能不能失败基于Git元数据的构建-我们的assets/源比assets-precompile/当前签入的新版本。答案可能会根据签出环境中的条件或者Rails构建的一些知识而得到改进。
git log -1 --format=%ct -- assets/将为您提供最新源提交的时间戳。git log -1 --format=%ct -- assets-precompile/将为您提供最新预编译签入的时间戳。在构建的早期添加一个条件,对这两个数字进行比较,如果1>=2,则任何发布版本都会失败。实际上,您可能希望在那里构建一个宽限期,万一有人在签出和运行预编译时以及在提交时插入提交,则需要在两者之间进行构建。
或者,为了对此进行更严格的处理,您可以将{资产/}的提交散列存储在一个文件中,如果它更改并与上次预编译时不同,则再次失败任何发行版构建,直到它再次预编译并签入:
git log --format=%H -- assets/..。并将其与您更新的提交哈希与预提交进行比较。您还可以为树哈希而不是提交哈希使用%T,这可能简化分支。
发布于 2015-06-13 18:20:59
我正在经历同样的努力,但我仍未能解决这个问题。第一步是使用git预提交钩子编译资产(只有在有修改的资产时才会做一些事情)。
http://jimneath.org/2012/05/05/precompile-assets-using-a-git-hook.html
编辑:看起来这个链接被核弹了,这是存档版本:https://web.archive.org/web/20161022195654/http://jimneath.org/2012/05/05/precompile-assets-using-a-git-hook.html
https://stackoverflow.com/questions/28888159
复制相似问题