【问题标题】:How to force Android Studio to use relative paths?如何强制 Android Studio 使用相对路径?
【发布时间】:2014-12-19 09:13:40
【问题描述】:

在 Android Studio 1.0.2 中创建的每个项目都包含多个引用项目自身绝对路径的文件。 如果我愿意,我什至无法移动自己的项目目录,更不用说与其他开发者共享项目了。

不包括app/build中的文件,这些是包含绝对路径的文件:

.idea/workspace.xml
.idea/modules.xml
.idea/libraries/support_v4_21_0_3.xml
.idea/libraries/appcompat_v7_21_0_3.xml
.idea/gradle.xml
.gradle/2.2.1/taskArtifacts/taskArtifacts.bin
.gradle/2.2.1/taskArtifacts/fileSnapshots.bin
app/app.iml

如何强制 Android Studio 对所有内容使用相对路径?

编辑:通过尝试 vanilla IDEA,我已将这些绝对路径的来源缩小到特定类型的模块,Android Studio 显然总是在不为您提供选择的情况下使用该模块。但我仍然没有更接近了解如何根除它们。

在 IDEA 14.0.2 中,如果您创建一个空项目或带有“应用程序模块”的 Android 项目,该项目不包含任何绝对路径。如果您使用“Gradle:Android 模块”创建项目,那么它在与 Android Studio 项目相同的文件中包含绝对路径。

编辑#2:创建IDEA-134587

【问题讨论】:

  • 我现在在公共汽车上,但您确定这些绝对路径真的会阻止您移动项目吗?我几乎可以肯定,如果您将该项目目录复制到一个新目录并打开项目或重新导入它并进行干净的构建,它将使用新的绝对路径更新所有这些文件,这些路径反映了原始项目副本的位置是。我几乎可以肯定我已经毫无问题地复制并打开了我的项目,但就像我说我在公共汽车上一样。虽然,也许我应该看一下,也许那些复制的项目因此而引用了原始项目。
  • @Mark 是的。如果我更改项目的绝对路径,那么当 AS 尝试打开它时,它会说,Cannot load module file '/old/path/to/module.iml'; file '/old/path/to/module.iml' does not exist. Would you like to remove module 'module' from the project?
  • @Mark 如果我说不,那么模块仍然没有显示。没有什么需要清理或构建的。

标签: android intellij-idea android-studio


【解决方案1】:

一般来说,不要将任何 .iml 文件或 .idea 文件夹的内容视为项目的一部分,也不要共享任何这些文件,不要将它们签入源代码管理,也不要将它们与项目一起移动。将它们视为缓存文件。

Gradle 文件是事实的来源,因此如果您在使用绝对路径时遇到问题,请关闭项目,删除不可共享的文件,然后从 Gradle 构建脚本中重新导入。

【讨论】:

  • 您没有解释为什么需要复制这些文件。为什么不从它的 Gradle 文件重建项目,而不用担心它在这些文件中放了什么?
  • 移动文件是很常见的事情。常识和多年使用其他构建工具的经验表明,项目永远不应包含绝对路径。
  • 我不是为 Android Studio 当前的行为辩护,只是解释一下。 Android Studio 不认为 .iml 文件或 .idea 文件夹是其“项目”的一部分,并且不鼓励用户共享它们或将它们签入源代码控制等。我知道这很令人困惑,因为总的来说 IntelliJ确实 认为这些是项目的一部分,并且因为它对路径更智能,但 Android Studio 认为 Gradle 是事实的来源。它将绝对路径放在那里的事实可能是一个错误,但出于这个原因,它的优先级较低。没有其他解决方法。
  • 人力资源部。我对变通办法从不满意,尤其是当变通办法的存在意味着开发人员将取消对烦人问题的优先级时。一旦我尝试深入代码并自己修复它失败,我会接受你的回答。如果我成功了,我会分享我所做的。
  • 如果您在多台计算机上使用 Dropbox(或其他文件共享)同步文件,这很糟糕。
【解决方案2】:

我遇到了完全相同的问题,但上面建议的解决方案与 JetBrains' advicethis answer 相矛盾。此外,我的同事使用相同的源代码(具有未扩展的路径)和 Android Studio 版本没有问题,所以我一直用头撞墙。

当我们意识到我使用的许多路径都包含符号链接时,我们最终解决了这个问题。就我而言,我为~/work 设置了一个符号链接,因此它指向/some/drive/with/space。在 Android Studio 中,我的所有源代码都来自 ~/work/source 而不是 /some/drive/with/space/source。当我更改所有内容以便 Android Studio 使用其实际路径引用事物时,$PROJECT_DIR$$MODULE_DIR$ 变量神奇地开始工作,我的 .iml 文件不再损坏。 YMMV。

TL;DR:不要在项目路径中使用符号链接!

【讨论】:

  • 啊!这本身就是一个非常烦人的错误。我一直将我的项目保存在一个符号链接的目录中。
【解决方案3】:

此外,请确保不要将 .gradle 中的文件作为共享项目的一部分。

此外,您可能希望共享的一组文件是您在 .idea/copyright 下的文件,因为这允许您共享版权设置。

所以一个可能的 .gitignore 文件可能是:

.gradle
.idea
!.idea/copyright/[YourCopyrightFile].xml
!.idea/copyright/profile_settings.xml
*.iml
构建
local.properties

【讨论】:

  • 应该共享的内容是次要问题,甚至无法在不破坏项目的情况下移动本地文件。
【解决方案4】:

嗯。我只是在这些文件中看不到相同的绝对路径,我只看到对 MODULE_DIR 和 PROJECT_DIR 的引用,例如:

./app/app.iml: <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />

或:

./.idea/workspace.xml:    <entry file="file://$PROJECT_DIR$/.idea/libraries/appcompat_v7_21_0_2.xml">

我想知道这是否只是 Linux 问题,还是您的设置中的问题?

【讨论】:

  • 我在 Linux 上也看不到绝对路径,只有我昨晚在 Mac 上看到的那些引用 $MODULE_DIR$ 和 $PROJECT_DIR$ 你的行看起来像 Kevin 的什么?
  • 在 Studio 和 IDEA 中,我的 ./app/app.iml 始终以 module 标记开头,该标记具有类似 external.root.project.path="$USER_HOME$/Projects/IDEA/Derp" 的属性。我的 ./.idea/workspace.xml 总是包含像&lt;option name="path" value="$USER_HOME$/BACKUP/Projects/IDEA/Derp/derp" /&gt; 这样的标签。 (注意~/Projects~/BACKUP/Projects 的符号链接。有些文件包含解析的路径,这是另一个错误。)
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多