2

使用 capistrano v2 子模块可以通过使用选项包含在部署中:

set :git_enable_submodules, 1

在 v3 中,这似乎不起作用。是否仍然支持此选项,或者是否有达到相同目标的新方法?

4

4 回答 4

3

在 capistrano 3.1.x 及更高版本中,您可以实现自己的 SCM 策略。有一个可用的 gem 可以帮助 git 子模块,请参阅:https ://github.com/i-ekho/capistrano-git-submodule-strategy 。

注意:repo如果您已经尝试过使用默认的 git 策略,您可能会遇到文件夹问题。只需转到服务器上的部署目录并将其删除,然后再次运行 cap deploy 即可修复。

于 2014-07-11T05:11:50.787 回答
2

事实证明,很难挂钩 capistrano 的任何 git 任务(因为它们在舞台设置之前不存在)。此外,git archive 不以任何方式提供对子模块的支持,因此必须完全替换该部分。

出于显而易见的原因,复制和粘贴也不是一种选择。

所以我写了这个简单的gem,可以代替git scm。它使用与 capistrano 2 类似的方法,通过克隆 repo 及其子模块。它非常简单,足以实现我们的目标。我怀疑那里没有很多不同的子模块用法(如果人们试图避免复杂化)。

https://github.com/juanibiapina/capistrano-scm-gitsubmodules

让我知道它是否也对您有帮助。

更新:

此模块已被 capistrano 3.1.0 弃用。试试这个:https ://gist.github.com/stevenscg/8176735

于 2013-10-24T18:01:48.260 回答
2

新的拉取请求“828”正在尝试再次实现: https ://github.com/capistrano/capistrano/pull/828

正如@coffeeaddict 所讨论的,这个Commit是你需要在本地部署的代码片段,直到它与 capistrano 本身捆绑在一起。请注意,您需要 Capistrano >= 3.1.0 才能使用该代码。

还有另一个Gist建议解决上述策略的一些问题。

于 2014-01-22T18:15:15.287 回答
0

正如您在 Capistrano 源代码中看到的那样https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/git.rake#L34https://github.com/capistrano/capistrano/blob /master/lib/capistrano/tasks/git.rake#L56它用于git archive将代码签出到发布目录中。

代码在这里复制:

desc 'Clone the repo to the cache'
task clone: :'git:wrapper' do
  on roles :all do
    if test " [ -f #{repo_path}/HEAD ] "
      info t(:mirror_exists, at: repo_path)
    else
      within deploy_path do
        with git_environmental_variables do
          execute :git, :clone, '--mirror', repo_url, repo_path
        end
      end
    end
  end
end
desc 'Update the repo mirror to reflect the origin state'
task update: :'git:clone' do
  on roles :all do
    within repo_path do
      execute :git, :remote, :update
    end
  end
end
desc 'Copy repo to releases'
task create_release: :'git:update' do
  on roles :all do
    with git_environmental_variables do
    within repo_path do
      execute :mkdir, '-p', release_path
      execute :git, :archive, fetch(:branch), '| tar -x -C', release_path
    end
  end
 end

由此我们可以确定不支持子模块。由于从未发出克隆或初始化子模块的命令,因此 git-archive 会忽略它们。

决定(来源:Capistrano author here)不包括“开箱即用”的子模块作为构建它所需的钩子,如果你需要它已经存在,并且编写一个附加任务是微不足道的您需要以适合您的方式签出/更新子模块。Capistrano v2 子模块支持通常会给人们带来意想不到的后果。

考虑到这一点。在更新完成后,可能值得挂钩update,初始化和更新您的子模块,并检查增强git-archive做您需要的方法。

于 2013-10-16T13:09:56.363 回答