Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails本地资源:预编译-是否有一种自动检查更改的方法?_Ruby On Rails_Git_Continuous Integration_Sprockets - Fatal编程技术网

Ruby on rails Rails本地资源:预编译-是否有一种自动检查更改的方法?

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,查看是否有任何输出。(如

我在部署期间遇到了资产预编译问题,因此我选择进行本地预编译,并将结果文件检入到源代码树中。我对这种方法没有任何问题,除了有时我忘记在没有预编译资产的情况下运行预编译任务和发布!:(

我想知道是否有人找到某种方法来检查是否发生了任何资产更改?理想情况下,我希望在我的CI服务器上运行某种检查,如果有资产更改尚未提交,则生成失败

我有几个想法:

  • 在CI服务器上运行
    RAILS\u ENV=production bundle exec rake assets:precompile
    ,查看是否有任何输出。(如果资产是最新的,则该命令似乎不会输出任何内容。)然而,似乎命令的输出与它运行的环境有某种联系,因为在本地运行命令、提交结果,然后在CI服务器上运行命令之后,仍然有来自命令的输出!我想知道为什么它与环境有联系,但我甚至找不到代码的源代码>rake资产:rails github repo中的预编译。有人知道它的源代码在哪里吗

  • 以某种方式编写一个命令,可以查看git历史记录,并确定自上次预编译以来我的
    assets/
    文件夹中是否有任何资产发生了更改。不确定这将如何工作

  • 这对我来说已经不止几次了,有时当同事提交资产更改时,我无法捕捉到这一点,而且这似乎真的是计算机应该能够捕捉到的。我想第三种比较合理的选择是让CI服务器简单地运行该命令,并将生成的文件提交给自动生成源代码树,但我不喜欢CI服务器进行提交的想法


    有什么想法吗?谢谢。

    我也在做同样的努力,但我还没能解决这个问题。第一步是使用git预提交钩子编译资产(只有在有修改的资产时才会执行)


    编辑:看起来链接被屏蔽了,这是存档版本:

    我的答案是基于Git的,是OP思想2的一个实现:基于Git元数据的构建是否会失败,告诉我们
    资产/
    源代码比当前签入的
    资产预编译/
    更新。答案可能会根据n签出环境中的条件,或Rails构建的一些知识

  • git log-1--format=%ct--assets/
    将为您提供最新源提交的时间戳
  • git log-1--format=%ct--assets precompile/
    将为您提供最新预编译签入的时间戳
  • 在构建的早期添加一个比较这两个数字的条件,如果1>=2,则任何发布构建都会失败。实际上,您可能希望在那里构建一个宽限期,以防在签出和运行预编译时,以及在提交时,有人带着提交滑入

    或者,更严格地说,您可以将{{assets/}}的提交散列存储在一个文件中,如果它发生了变化,并且与上次预编译时的散列不同,则再次使任何版本生成失败,直到它再次预编译并签入:

    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或其他包有点疯狂