使用外挂?最佳实践?
这很容易!不要这样做!
这svn:externals
是其中一件看似不错的主意,但最终导致了各种问题。我发现有比使用svn:externals
. 例如,您可以使用 Maven 或 Ivy 为您做依赖管理。
但是,如果我必须使用svn:externals
,我将使用标签而不是绝对修订。这在较新版本的 Subversion 中效果更好,而且我通常不必担心使用特定版本,但是随着文件被重命名和移动,文件的 URL 都会发生变化。对我来说,标签是不可变的,一旦创建,它们就永远不会改变。
这也鼓励您将自己的svn:externals
项目视为完全独立的项目。例如,您可以谈论 Foundation 4.3 版本。你的svn:externals
命令看起来像这样:
$ svn propset svn:externals `^/tags/4.3/foundation foundation` .
注意我没有将 URL 方案放在标签或服务器名称中。如果外部与项目在同一个存储库中,我几乎总是使用相对路径。想象一下,如果您使用 to use http://
,然后转到 using https://
,或者您的 Subversion 存储库机器的名称发生更改。外部仍然可以使用这个方案,但是如果我这样做了就会中断:
$ svn propset svn:externals "http://server.com/svn//tags/foundation foundation" .
我是一个可悲的骗子
我目前正在一个项目中工作,我没有做我上面提到的事情。我不为 my 使用标签,svn:externals
我们所有的项目都必须有它们。
在这家公司,他们在 jar 依赖管理方面遇到了一个可怕的问题。他们生产了十几个用于多个项目的基础罐子。这些项目中的每一个都有不同的方式来指定这些罐子
为了解决这个问题,我建立了一个名为ivy.dir
. 开发人员被告知使用以下命令将此项目合并到他们当前的项目中:
$ svn propset svn:externals "../ivy.dir ivy.dir" .
里面ivy.dir
是一个完整的设置,用于将您的项目集成到 Ivy。Ivy 已预先配置为使用我们新的企业 Maven 存储库。我们所有的各种构建工具都在这里。
这种方法使将 Ivy 和良好的依赖管理融入我们的项目变得轻而易举。您只需<import>
将ivy.dir/ivy.tasks.xml
文件放入您的 currentbuild.xml
中,并用于<ivy:cachepath>
创建您的类路径。一个良好的、良好的格式build.xml
只需要稍加修改即可运行。
我什至创建了一个特殊的<jar.macro>
宏定义。它与<jar>
宏几乎 100% 兼容,但它会自动创建一个pom.xml
文件ivy.xml
并将其嵌入到构建的 Jar 中(并且还将包括 Jenkins 项目名称、构建日期和构建号。)
通过使用相对 URL,我可以轻松地对所有内容进行分支或标记(并且 ivy.dir 项目也被标记)。
这是一种奇怪的使用方式svn:externals
,但它让我们摆脱了以前的糟糕使用方式,其中许多项目过去常常svn:externals
拉入存储在存储库中的 jar。