7

我有以下文件,我想将它们作为 9.8.0 版本的工件上传到 Artifactory。

注意:前两个文件没有扩展名(它们是可执行文件,即如果你在上面打开它们/cat,你会看到垃圾字符)。

CVS 中给定版本 9.8.0 的文件夹/文件如下:

com.company.project/gigaproject/v9.8.0/linux/gigainstall
com.company.project/gigaproject/v9.8.0/solaris/gigainstall
com.company.project/gigaproject/v9.8.0/win32/gigainstall.exe
com.company.project/gigaproject/v9.8.0/gigafile.dtd
com.company.project/gigaproject/v9.8.0/gigaanotherfile.dtd
com.company.project/gigaproject/v9.8.0/giga.jar
com.company.project/gigaproject/v9.8.0/giga.war

上传具有扩展名的上述文件非常容易......您以有权部署工件的管理员/用户身份登录 Artifactory,单击“部署”选项卡,浏览 Artifactory 文件,然后选择文件,点击“上传”按钮。

在此处输入图像描述

接下来,您将看到一个屏幕(如上图所示)。您将在此页面上的字段中调整您想要的内容,一旦单击“部署工件”,您就完成了。您只需确保file.extension在上传时选择正确的文件,并确保文件扩展名正确显示在“目标路径”框中(版本为 -xxx 等)。

我的问题:

问题 1:如何上传没有扩展名的工件?似乎 Artifactory 默认将工件作为 .jar 扩展名。如何上传 Linux 和 Solaris 上面文件夹/文件结构中所示的“gigainstall”工件?我看到我可以使用工件名称作为 gigainstall-linux 和 gigainstall-solaris 并区分它,但我不确定如何告诉 Artifactory 这个工件没有任何扩展名。

我不认为开发团队会开始使用适当的扩展生成这个工件(因为这个工件可能在其他项目中的任何地方都被硬编码,他们目前从某个地方的 CVS/SVN 源代码控制中获取它——这本身就是一个不好的做法将工件存储在源代码控制版本工具中)。

在此处输入图像描述

问题 2:我如何告诉构建系统(例如 Gradle)在“编译”任务期间使用非扩展工件。在依赖项 { .. } 部分下的 build.gradle 中,我将添加如下所示的内容,但我不确定非扩展文件(我上面提到的文件夹/文件结构中的前两个)。

依赖{
     //编译'com.company.project:gigainstall-linux:9.8.0@'
     //编译'com.company.project:gigainstall-linux:9.8.0@??????'
     //编译'com.company.project:gigainstall-linux:9.8.0@""'
     //编译'com.company.project:gigainstall-linux:9.8.0@"none"'
     //编译'com.company.project:gigainstall-linux:9.8.0@"NULL_or_something"'

     // 下面将从 Artifactory 存储库中轻松获取 giga.jar 版本 giga-9.8.0.jar
     编译'com.company.project:giga:9.8.0'

     // 下面会很容易得到giga.war
     编译'com.company.project:giga:9.8.0@war'

     // 类似地,其他基于扩展的工件可以从 Artifactory 中获取
     编译'com.company.project:gigafile:9.8.0@dtd'
     编译'com.company.project:gigaanotherfile:9.8.0@dtd'
}
4

1 回答 1

7

答案 1在不同的意义上也将涵盖 2):使用“部署”选项卡下的 Artifactory“Artifact Bundle”功能部分可以通过首先创建一个 zip 文件来执行至少以我们想要的方式上传工件的技巧(包含其中的结构和工件)--或者您可以使用/调用Artifactory REST API方式上传工件。

高层次的想法:

创建 Artifactory 可以读取的名为 gigaproject.zip 或 anyname.zip/.tar/compressed 文件的 zip 文件。在 zip 中,创建结构 - 如何将这些工件加载到 Artifactory

gigaproject.zip 将包含以下文件夹/结构/文件。

情况1:

com/company/project/gigaproject/9.8.0/linux/gigainstall
com/company/project/gigaproject/9.8.0/solaris/gigainstall
com/company/project/gigaproject/9.8.0/win32/gigainstall.exe
com/company/project/gigaproject/9.8.0/gigafile.dtd
com/company/project/gigaproject/9.8.0/gigaanotherfile.dtd
com/company/project/gigaproject/9.8.0/giga.jar
com/company/project/gigaproject/9.8.0/giga.war

注意:在案例 1 示例中,我没有在文件名中使用任何 -xxx(即,我使用的是简单明了的 giga.jar 而不是 giga-9.8.0.jar)。

在此处输入图像描述

上面的 Upload/Deploy 将生成文件(如以下快照所示):

在此处输入图像描述

所以,我们已经实现了我们想要的。实际上(显然是这样),但 Artifactory 通常不会以某种方式存储这些工件(因为它们应该 -xxx 版本嵌入在文件名中,并且工件 id 应该与工件文件名匹配)。现在,如果您想在 Gradle 构建文件中使用以下内容,首先您不能上传带有 -xxx 版本名称的文件名,其次,我们案例 1 树中的工件 id 是“gigaproject”(在 com/company/project 文件夹之后),因此 Gradle 定义您想要的工件 id 和工件文件名的方式将不起作用。

compile 'com.company.project:gigaproject:CANNOTSAY_HOW_TO_GET_GIGA_JARorGIGAINSTALL_with_without_extension'

结论:可以以任何结构上传任何文件(在 Artifactory 中带有/不带扩展名),但这取决于您的构建系统将如何使用它或是否能够使用它。- 我从 Artifactory 存储库中删除了我刚刚使用案例 1 .zip 文件创建的结构,以尝试下一个案例#2,并删除了我创建的 .zip 文件。

案例二:

让我们为每个工件创建一个单独的版本化文件名,并以格式创建结构 - Artifactory 如何实际存储它们(在树视图中的存储库中看到的工件)并创建一个包含该结构的 .zip 文件。让我们使用相同的“Artifact Bundle”功能来上传这个 .zip 文件,以上传我们在 Artifactory 中需要的单个工件 - 其中 artifact-id(我们在尝试使用它时提到的第二个值)将匹配 Artifactory 中的工件文件名称。

.zip 文件的文件夹/文件结构:

com/company/project/gigainstall/9.8.0/gigainstall-9.8.0.linux
com/company/project/gigainstall/9.8.0/gigainstall-9.8.0.solaris
com/company/project/gigainstall/9.8.0/gigainstall-9.8.0.exe
com/company/project/gigafile/9.8.0/gigafile-9.8.0.dtd
com/company/project/gigaanotherfile/9.8.0/gigaanotherfile-9.8.0.dtd
com/company/project/giga/9.8.0/giga-9.8.0.jar
com/company/project/giga/9.8.0/giga-9.8.0.war

注意:这一次,我们将使用相同的“Artifact Bundle”功能和类似的文件(Linux/Solaris 文件夹下的 gigainstall),我采用创建 gigainstall 文件夹的方法(包含 gigainstall-9.8.0.linux 和 gigainstall -9.8.0.solaris 文件名),即当我们在 Gradle 中的依赖项 { ... } 部分下使用这些工件进行编译时,我们将使用 xxx@ 方式从 Artifactory 获取这些工件。

在此处输入图像描述

好的,一旦“Artifact Bundle”部署/上传成功完成,我收到以下消息。

成功部署了存档中的 7 个工件:gigaproject.zip(1 秒)。

现在,让我们看看它在 Artifactory 中的样子,同时在 Tree 视图中搜索工件之一。你可以看到我们现在已经有了文件,使用 filename-xxxextension 方式,以便我可以在 Gradle 中轻松使用它们。

在 Gradle 构建文件 (build.gradle) 中,我会提到:

依赖{
  编译“com.company.project:gigainstall:9.8.0@linux”
  编译“com.company.project:gigainstall:9.8.0@solaris”
  编译“com.company.project:gigainstall:9.8.0@linux”
  编译“com.company.project:giga:9.8.0
  编译“com.company.project:giga:9.8.0@war
  编译“com.company.project:gigafile:9.8.0@dtd
  编译“com.company.project:gigaanotherfile:9.8.0@dtd
}


哦哦!!- 这不起作用,请参阅下面的 Gradle 错误。为什么?- Artifactory Bundle 上传/部署功能会上传 .zip 中的 zip 文件内容,但它不会为每个部署的工件创建 .pom 文件。因此,使 Gradle 构建失败。可能在 Ant 中这可能会成功。这发生在每个单独的 .jar/.war/.dtd/etc 文件中。我只是展示一个错误示例。

在进行gradle clean build时

Could not resolve all dependencies for configuration ':compile'.
> Could not resolve com.company.project:gigafile:0.0.0.
  Required by:
      com.company.project:ABCProjectWhichConsumesGIGAProjectArtifacts:1.64.0
   > Could not GET 'http://artifactoryserver:8081/artifactory/ext-snapshot-local/com/company/project/gigafile/0.0.0/gigafile-0.0.0.pom'. Received status code 409 from server: Conflict

案例3:让我们采取一种简单的方法(解决方法,但会节省很多痛苦)。创建具有以下结构的 gigaproject.zip 文件,此方法采用 - 文件夹/文件结构中的单个工件/文件名中没有嵌入 xxx 版本值。我们将使用“Single Artifact”方法(它将在 Artifactory 提供的上传/部署过程中自动为 gigaproject.zip 文件创建 .pom)。您仍然可以使用这种方法获得 gigainstall 文件,而无需对其名称进行任何扩展。如您所见,在上传/部署步骤中,您上传 gigaproject.zip,artifactory 会将其作为“ gigaproject-xxx.zip ”上传到给定的目标存储库,其中xxx9.8.0在我们的例子中。请参阅下面的图像快照。

gigaproject/linux/gigainstall
gigaproject/solaris/gigainstall
gigaproject/win32/gigainstall.exe
gigaproject/gigafile.dtd
gigaproject/gigaanotherfile.dtd
gigaproject/gigaproject.zip
gigaproject/giga.jar
gigaproject/giga.war

现在,使用“Single Artifact”功能将其上传到 Artifactory。调整 GroupId、ArtifactId、Version 等的值后,单击“Deploy Artifact”。

在此处输入图像描述

在此处输入图像描述

一旦这个被上传。您将在目标存储库中的 zip 工件中看到(我举了一个不好的例子,通常这将是 libs-snapshot-local 或 libs-release-local 而不是 ext-...),您将能够使用直接在 Gradle 中的 ZIP 工件:

dependencies {
   // This is the only line we need now.
   compile "com.company.project:gigaproject:9.8.0@zip"
}

一旦 .zip 可用于 Gradle 构建系统,现在您可以告诉 Gradle 在您的构建/工作区的某个位置解压缩此 .zip 文件,您可以在其中提供实际(解压缩的)文件(gigainstall、.dtd、.jar、.war等)到构建过程/步骤。

PS:我猜案例# 1 和 2 对 Ant 有效。



答案 2: 如果您以任一方式上传了非扩展文件。确保您也手动创建/上传了它的 POM 文件(即,如果我将 gigainstall-9.8.0 作为工件上传到com/company/project/gigainstall/9.8.0/gigainstall-9.8.0 下,那么在同一级别,我必须/应该创建它的 POM 文件(参见自定义 jar 工件的简单模板 .pom 文件,或者在通过“Single Artifact”部署上传扩展文件时,您将看到POM 编辑器窗口显示的内容)并上传两者这样 Gradle 就不会出错说没有 POM 冲突/错误。Ant 可能不需要 pom(我没有检查)。

一旦它在 Artifactory 中,以下行应该可以工作——或者如果你找到另一种方法,请发表评论。

dependencies {
   // See nothing mentioned after - x.x.x@
   compile "com.company.package:gigainstall:9.8.0@"
}
于 2014-07-03T20:26:19.640 回答