Ruby on rails Rails本地资源:预编译-是否有一种自动检查更改的方法?
我在部署期间遇到了资产预编译问题,因此我选择进行本地预编译,并将结果文件检入到源代码树中。我对这种方法没有任何问题,除了有时我忘记在没有预编译资产的情况下运行预编译任务和发布!:( 我想知道是否有人找到某种方法来检查是否发生了任何资产更改?理想情况下,我希望在我的CI服务器上运行某种检查,如果有资产更改尚未提交,则生成失败 我有几个想法:Ruby on rails Rails本地资源:预编译-是否有一种自动检查更改的方法?,ruby-on-rails,git,continuous-integration,sprockets,Ruby On Rails,Git,Continuous Integration,Sprockets,我在部署期间遇到了资产预编译问题,因此我选择进行本地预编译,并将结果文件检入到源代码树中。我对这种方法没有任何问题,除了有时我忘记在没有预编译资产的情况下运行预编译任务和发布!:( 我想知道是否有人找到某种方法来检查是否发生了任何资产更改?理想情况下,我希望在我的CI服务器上运行某种检查,如果有资产更改尚未提交,则生成失败 我有几个想法: 在CI服务器上运行RAILS\u ENV=production bundle exec rake assets:precompile,查看是否有任何输出。(如
RAILS\u ENV=production bundle exec rake assets:precompile
,查看是否有任何输出。(如果资产是最新的,则该命令似乎不会输出任何内容。)然而,似乎命令的输出与它运行的环境有某种联系,因为在本地运行命令、提交结果,然后在CI服务器上运行命令之后,仍然有来自命令的输出!我想知道为什么它与环境有联系,但我甚至找不到代码的源代码>rake资产:rails github repo中的预编译。有人知道它的源代码在哪里吗assets/
文件夹中是否有任何资产发生了更改。不确定这将如何工作有什么想法吗?谢谢。我也在做同样的努力,但我还没能解决这个问题。第一步是使用git预提交钩子编译资产(只有在有修改的资产时才会执行)
编辑:看起来链接被屏蔽了,这是存档版本:我的答案是基于Git的,是OP思想2的一个实现:基于Git元数据的构建是否会失败,告诉我们
资产/
源代码比当前签入的资产预编译/
更新。答案可能会根据n签出环境中的条件,或Rails构建的一些知识
git log-1--format=%ct--assets/
将为您提供最新源提交的时间戳git log-1--format=%ct--assets precompile/
将为您提供最新预编译签入的时间戳git log --format=%H -- assets/
…并将其与使用预提交更新的提交哈希进行比较。您还可以对树哈希使用
%T
,而不是提交哈希,这可能会简化分支。您可以在中找到预编译任务的源。您在本地看不到任何更改的原因可能是由于指纹,而默认情况下,h在生产环境中启用,在其他环境中禁用(因为使用指纹进行调试可能会很麻烦)。您可以使用config.assets.digest
启用它,如中所述
正如您所提到的,很容易忘记预编译步骤。一种优雅的自动化方法是从repo中删除已编译的资产,并添加capistrano(或CI)任务,以便在每次部署时预编译资产。预编译最好在CI服务器上进行(而不是在每个生产服务器上运行)。这种方法还减轻了不断扫描已编译资产以查找更改的需要(您真的不必关心这些更改)
自动将任何内容提交到您的回购协议中是一个坏主意-除了意外提交之外,您最终会使您的提交历史变得复杂。这里有一个Bash脚本,如果master in(app | lib | vendor)上有任何更改,它可以用作本地预编译资产的基础/资产。如果存在更改,这些资产将在本地预编译,您将使用生产服务器rsync
。这是基于这样一个前提,即每次提交到生产分支时都会有一个部署。基于Michael Trojaek的一篇加速部署的文章
它假设使用rvm gemeset
#!/bin/sh
cd /Users/my_user/Rails_Projects/myrailsapp
branch="master"
git checkout "$branch" &> /dev/null
curbranch=`git branch | grep \* | cut -d ' ' -f2`
if [ "$curbranch" == "$branch" ]; then
echo "You are on the $curbranch branch"
changes=`git diff --name-only HEAD~ HEAD | grep -E "(app|lib|vendor)/assets"`
if [ -z "$changes" ]; then
echo "No assets need to be precompiled"
else
echo "Here are files that have changes: $changes"
echo "Beginning precompile of Rails assets..."
source /Users/my_user/.rvm/environments/ruby-2.4.1@Rails-4.2.8
bundle exec rake assets:precompile RAILS_ENV=production
fi
else
echo "Unable to checkout "$branch" branch"
fi
我发现,rake assets:precompile
任务是在项目中定义的。尽管如此,在这方面还没有取得任何进展。我希望我可以通过挖掘代码推断出发生了什么。我在Sprocket rails项目中记录了一个关于这方面的问题-如果你有这个问题,我建议你进行投票。有没有一个公共项目,其中可以演示rake资产中的环境可变性:预编译(当然可以找到环境中所需的关键差异)但是,这并不能解决最初的问题-为什么在一个开发人员的机器上运行rake assets:precompile
不会导致任何更改,但在另一个开发人员的机器上运行完全相同的命令会导致更改。没有gem或其他包有点疯狂