使用 capistrano v2 子模块可以通过使用选项包含在部署中:
set :git_enable_submodules, 1
在 v3 中,这似乎不起作用。是否仍然支持此选项,或者是否有达到相同目标的新方法?
使用 capistrano v2 子模块可以通过使用选项包含在部署中:
set :git_enable_submodules, 1
在 v3 中,这似乎不起作用。是否仍然支持此选项,或者是否有达到相同目标的新方法?
在 capistrano 3.1.x 及更高版本中,您可以实现自己的 SCM 策略。有一个可用的 gem 可以帮助 git 子模块,请参阅:https ://github.com/i-ekho/capistrano-git-submodule-strategy 。
注意:repo
如果您已经尝试过使用默认的 git 策略,您可能会遇到文件夹问题。只需转到服务器上的部署目录并将其删除,然后再次运行 cap deploy 即可修复。
事实证明,很难挂钩 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
新的拉取请求“828”正在尝试再次实现: https ://github.com/capistrano/capistrano/pull/828
正如@coffeeaddict 所讨论的,这个Commit是你需要在本地部署的代码片段,直到它与 capistrano 本身捆绑在一起。请注意,您需要 Capistrano >= 3.1.0 才能使用该代码。
还有另一个Gist建议解决上述策略的一些问题。
正如您在 Capistrano 源代码中看到的那样https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/git.rake#L34和https://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
做您需要的方法。