【问题标题】:How to upload an artifact to Artifactory / consume it in a build system (Gradle Maven Ant) where the artifact does not have an extension如何将工件上传到 Artifactory / 在工件没有扩展名的构建系统(Gradle Maven Ant)中使用它
【发布时间】:2014-08-23 13:46:48
【问题描述】:

我想将以下文件作为 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 文件,并确保文件扩展名正确显示在“目标路径”框中(版本为 -x.x.x 等)。

我的问题:

问题 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' }

【问题讨论】:

    标签: file upload gradle artifactory artifact


    【解决方案1】:

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

    高层次的想法:

    创建一个名为 gigaproject.zip 的 zip 文件或 Artifactory 可以读取的 anyname.zip/.tar/compressed 文件。在 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 通常不会以某种方式存储这些工件(因为它们应该 -x.x.x 版本嵌入在文件名中,并且工件 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 文件。

    案例 2:

    让我们为每个工件创建一个单独的版本化文件名,并以格式创建结构 - 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 中的样子,同时在树视图中搜索工件之一。您可以看到我们现在已经有了文件,使用 filename-x.x.x.extension 方式,以便我可以在 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 }


    OH OH!! - 这不起作用,请参阅下面的 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 文件,此方法采用 - 文件夹/文件结构中的单个工件/文件名中没有嵌入 x.x.x 版本值。我们将使用“Single Artifact”方法(它将在 Artifactory 提供的上传/部署过程中自动为 gigaproject.zip 文件创建 .pom)。您仍然可以使用这种方法获得 gigainstall 文件,而无需对其名称进行任何扩展。如您所见,在上传/部署步骤中,您上传 gigaproject.zip,artifactory 会将其作为“gigaproject-xxx.zip”上传到给定的目标存储库,其中 xxx在我们的例子中,em> 是 9.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

    现在,使用“单个工件”功能将其上传到 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 文件或通过“单个工件”部署上传扩展文件时,您会看到 POM 编辑器 窗口显示给你)并上传两者,这样 Gradle 就不会出错,说没有 POM 冲突/错误。Ant 可能不需要 pom(我没有检查)。

    一旦它在 Artifactory 中,以下行应该可以工作 - 或者如果您找到其他方法,请发表评论。

    dependencies {
       // See nothing mentioned after - x.x.x@
       compile "com.company.package:gigainstall:9.8.0@"
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      相关资源
      最近更新 更多