【问题标题】:Intellij & Gradle module file nameIntellij & Gradle 模块文件名
【发布时间】:2014-01-09 18:09:29
【问题描述】:

我正在尝试将现有项目从 ant 转移到 gradle。我正在使用 Intellij 13,并且通过删除 iml 文件,我设法让一个模块在 gradle 下运行。但是,它坚持编写一个名称与目录名称而不是模块名称匹配的 iml 文件。

我认识到,对于在 IDE 和版本从上层传下来的大公司中单独工作或在单个团队中工作的人来说,这可能不是问题。然而,这个项目涉及来自几家公司的各种承包商,他们都提供自己的 IDE。 Intellij 的许可模式使得将 IDE 提供给外部承包商变得不切实际,因为大多数工作都是在场外完成的,一旦您提供许可密钥,就无法收回或取消授权。

由于升级 Intellij 不是免费的,几乎不可能同时协调所有人进行升级,因此我使用基于文件的项目格式,一个名为 ourproject.ij12.ipr1 的项目文件和另一个名为 ourproject.ij13.ipr 的项目文件和 iml 文件用于目录foo中的模块是foo.ij12.imlfoo.ij13.iml

这很好用,并且政策是每个人都可以在 14 出来之前从 12 下车,这样我们就不会获得无限数量的版本,但我们也不必在纳秒内同步我们的升级要么。

不幸的是,一旦我尝试在 intellij 的 foo 目录中使用 build.gradle,它就会写入 foo.iml,这完全违反了上述约定。此外,它添加了另一个模块(无需询问),这会导致同一目录中的两个模块,并且 ide 不会让您更改任何一个,因为同一目录中的两个模块是错误的。

谁能告诉我在使用 gradle 时如何影响 Intellij 为 iml 文件编写的文件名?显然,除非我对 symlinks 和 ant.symlinks 任务非常详细,否则有单独的目录名称是行不通的,如果有人尝试在 Windows 上本地运行它,那将无法正常工作。

编辑:由于人们似乎习惯于删除他们不接受的答案,让我澄清一下。我知道 gradle idea eclipse 插件。我不是在寻求 IDE 不可知论的指南。我发现 IDE 设置中有一些有价值的东西,并希望使用相同的 IDE 与其他人共享它们(其中“相同”包括版本,不希望跨版本共享,但一次不止一个版本)。

更具体地说,我正在寻找以下之一:

  • 允许我控制 iml 文件的文件名的配置或技巧
  • 另一种维护两个版本的 ide 文件的方法,即不太拜占庭式。
  • 来自参与 SO 的 JetBrains 人员之一的确认,不再有办法通过 IDEA 实现我的目标。

EDIT2: 涉及 gradle 生成文件的解决方案将不起作用。 Intellij 13 更改文件名以匹配目录名而不是模块名,这是问题的根源。我需要一个解决方案来说服 Intellij 不要那样做。 在升级到 13 之前我没有任何问题。

【问题讨论】:

标签: java ant intellij-idea gradle


【解决方案1】:

使用idea插件,我能够让它根据命令行参数为我生成两个iml文件。这是我创建的(最小)build.gradle 文件

apply plugin: 'java'
apply plugin: 'idea'

def imlName = name + (hasProperty('generate12') ? '.ij12' : '.ij13')

idea {
    module {
    name = imlName
    }
}

默认情况下,此脚本将为您生成一个“13”文件。因此,要更改它,您需要设置 generate12 属性。

我运行的命令:

> gradle idea
> gradle idea -Pgenerate12=true
> ls
  build.gradle  test.ij12.iml test.ij13.iml test.ipr test.iws

idea module 文档可能会为您提供一些更有用的东西。

旁注: 我认为最好将没有 iml 文件的项目提供给每个人,并告诉他们运行 gradle idea(没有自定义 iml 名称)来创建文件。这将使您不必维护将被 IntelliJ 修改和覆盖的文件。我们签入 iml 文件,当有人签入某些内容并为所有人破坏时,它只会导致问题。

【讨论】:

  • 有趣,但文件名不是重点。关键是要有一个具有 12 的功能和设置的文件,另一个具有 13 的功能和设置的文件。在您建议的解决方案中,两个生成的文件之间没有区别。另请注意,test.ij12.ipr 和 test.ij13.ipr 也是必需的......而且我的经验是,即使它最初读取名为 test.ij13 的文件,intellij 13 也会开始为模块编写 test.iml在测试目录中。我需要一个在 intellij 内部的解决方案,否则该行为将排除任何外部解决方案。
  • 所以您想知道如何在一个目录中拥有多个项目文件(iml、ipr 等),仅使用 intellij 配置,以便在您打开项目文件(12 或 13)时打开文件名是否正确?
  • 我实际上并不关心文件来自哪里,但问题在于 intellij 重新命名文件。至于 gradle 标签,虽然解决方案可能不包含 gradle 代码,但这个问题 does 涉及并与 gradle 相关。
  • 我越来越多地认为解决方案实际上并不存在。我应该把它作为一个问题发布在 YouTrack 中。
【解决方案2】:

使用 settings.gradle 文件更改模块名称。 Intellij 应该使用它。 接下来,您可以使用 gradle.properties 来设置您的前缀。

例如 setting.gradle:

rootProject.name = adjustName("ourproject")

include "someProject"
// ... other includes

rootProject.children.each{ it.name=adjustName(it.name)}

String adjustName(String name) {
    String pref = System.properties['myIdeaVersionPrefix']
    return pref != null ? name + "." + pref : name
}

gradle.properties:

systemProp.myIdeaVersionPrefix=ij13

查看http://i.stack.imgur.com/CH2Bv.png的配置截图

【讨论】:

    【解决方案3】:

    似乎没有一个好的答案。我已将此作为一个错误提交到 YouTrack http://youtrack.jetbrains.com/issue/IDEA-119625

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 2016-08-09
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多