【问题标题】:Gradle project dependency does not build dependency projectGradle 项目依赖不构建依赖项目
【发布时间】:2013-01-30 09:59:29
【问题描述】:

我有一个 Gradle 多项目。

其中一个项目是 Flex 项目,它是使用 gradleFx 插件构建的。

第二个是war项目,我需要将Flex项目中的SWF文件包含到war中。

我添加

war { 
  from (project(":flex:FlexManager").buildDir) {into ('flash')}
}

它确实让 SWF 陷入战争,但前提是 SWF 已经存在。

然后我希望 gradle 在构建我的战争期间构建 :flex:FlexManager 项目。所以我加了

dependencies {
  ....
  runtime project(path : ':flex:FlexManager')
}

我发现在战争构建期间启动 flex 项目构建的唯一方法是

war { 
  ...
   dependsOn ':flex:FlexManager:build'
}

但这看起来不是最好的方法——我更喜欢定义项目依赖而不是任务依赖

【问题讨论】:

    标签: gradle gradlefx


    【解决方案1】:

    您需要更改的只是指定要从任务或任务输出而不是目录复制 - 这将在您的战争任务和构建 swf 文件的任何任务之间注册隐式依赖关系。

    表示构建 swf 文件的任务有必要指定其输出。我快速浏览了 GradleFx,不幸的是,compileFlex 任务似乎没有这样做。因此,首先您需要通过以下方式指定任务的输出:

    compileFlex {
        outputs.dir project.buildDir
    }
    

    然后修改你的战争任务配置:

    war {
        from project(":flex:FlexManager").compileFlex {
            into ('flash')
        }
    }
    

    您可能还应该唠叨 GradleFx 开发人员为他们的任务添加输出。 :)

    编辑:

    从 cmets 的讨论中,我了解到,您可以依赖项目工件,而不是依赖任务。最干净的方法是创建一个自定义配置,为其添加依赖,然后在配置war任务时在from调用中使用它:

    configuration {
        flex
    }
    
    dependencies {
        flex project(':flex:FlexManager')
    }
    
    war {
        from configurations.flex {
            into ('flash')
        }
    }
    

    您也可以直接使用:flex:FlexManager 的存档或默认配置:

    war {
        from project(':flex:FlexManager').configurations.archives {
            into ('flash')
        }
    }
    

    【讨论】:

    • 有帮助,谢谢!但是我可以在项目之间而不是任务之间创建依赖关系吗?
    • 不可以,Gradle中没有这个概念,只能指定任务之间的依赖关系。您需要什么项目依赖项?
    • 谢谢,我不需要。我只是认为就像外部依赖一样,我们定义了对工件的依赖(即构建结果),就像我可以为项目依赖定义它一样 - 即我的项目依赖于另一个项目工件(构建结果)
    • 哦,现在我知道你的意思了。您指的是在您的问题中尝试添加对 project(':flex:FlexManager') 的运行时依赖项。这是完全有效的,如下所述:gradle.org/docs/current/userguide/…。问题是您使用了运行时配置,在运行战争任务时未解决。您需要创建一个自定义配置并向其添加项目依赖项,然后在您的战争任务中使用 from 调用中的配置,因为配置是 FileCollection 并且可以这样使用
    • 我也尝试使用 War 插件支持的 'compile' 配置来实现,但又一次 - 没有成功
    【解决方案2】:

    我的项目中有类似的要求。我需要将作为 flex 项目输出的 swf 文件包含到 java 项目中并构建战争。

    1. I created a two sub project under war project, flex and java.
    2. Included them in settings file.
    3. The main build.gradle file has basic configuration.
    4. In flex sub project gradlefx plugin is applied and the output swf file is copied to the directory using a copy task.
    5. In java sub project war plugin is applied and the source directory is mentioned from which war has to be generated.
    

    这是一个示例代码供您参考:

    settings.xml:

    include myproject,
    myproject:mysubproject:flex,
    myproject:mysubproject:java
    

    myproject 目录中的 build.gradle 文件:

    buildscript {
        dependencies {
            classpath project (":FlexProject") //include all the flex project from which the swf file to be included
        }
    }
    dependencies {
        classpath project (":JavaProject") //include all the dependent java project if any
    }
    
    sourceSets {
      main {
        output.classesDir   = 'root/WEB-INF/classes' //This is the directory from which I am going to generate war.
      }
    }
    

    myproject/mysubproject/flex 目录中的 build.gradle 文件:

    apply plugin: 'gradlefx'
    type = 'swf'
    dependencies{
        merged project (":FlexProject")
    }
    
    String rootProjectDir = rootDir
    rootProjectDir = rootProjectDir.replaceAll("\\\\","/")
    
    task copyTask <<{
        copy{
            from rootProjectDir +'/MyFlexProject1/build'
            into rootProjectDir +'/myproject/root'
            include '**/*.swf'
        }
    }
    build.finalizedBy(copyTask)
    

    myproject/mysubproject/java 目录中的 build.gradle 文件:

    String rootProjectDir = rootDir
    rootProjectDir = rootProjectDir.replaceAll("\\\\","/")
    String rootProjectDirDocRoot = rootProjectDir + '/myproject/root'
    
    dependencies {
        compile project (":JavaProject")    //to include dependent jars in war
    }
    
    group = "com.abc.enterprise"
    archivesBaseName = "myprojet"
    description = "myproject"
    apply plugin: 'war'
    
    war{
        from rootProjectDirDocRoot
        exclude('.gradle')
        exclude('.settings')
    }
    

    这将每次编译 flex 项目,并且他的 swf 文件将包含在必须从中构建战争的目录中。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 2018-03-10
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多