【问题标题】:PyCharm mark directory as excluded via flag in the filesystem?PyCharm通过文件系统中的标志将目录标记为排除?
【发布时间】:2021-10-12 21:14:39
【问题描述】:

我想通过匹配目录中的标志排除 PyCharm 中排除的某些目录。

示例:我们的测试创建了一个名为 .reports 的目录。

我知道如何在我的 PyCharm 实例中排除这个目录。

但是我们有很多开发人员和很多项目。我真的很想避免每个开发人员都需要将此目录标记为已排除。

有没有办法告诉 PyCharm 跳过这个文件?

例如通过创建一个名为“.pycharm-exclude”的空文件?

我正在寻找一种自动排除目录的方法,因为我们有多个开发人员,每个开发人员都有多个项目。

我创建了一个功能请求:https://youtrack.jetbrains.com/issue/PY-51093

【问题讨论】:

    标签: pycharm


    【解决方案1】:

    我不知道任何类似于忽略文件的方式,因为 PyCharm 似乎希望您使用它的 GUI 进行配置。但是,如果您可以灵活地采用不同的方法...

    查看Settings | Editor | File Types | Ignore files and subfolders的默认文件/目录忽略列表

    您可以重命名.reports -> .reports~.reports.pyc.reports.rbc.svn 等,PyCharm 会忽略它。

    默认情况下,PyCharm 会忽略一些模式/名称,因为它们是常见的非项目名称。如果您将目录命名为与这些模式/名称之一匹配的内容,那么您可以欺骗 PyCharm 忽略该目录。有大约 20 个模式/名称默认被忽略(在上面的路径中找到),所以我会选择在团队中造成最少混乱/防止一些我不知道的问题。

    如果您想要一个更合理的名称,您可以将 .report; 添加到此列表中,因为此列表在所有项目中都存在,但每个开发人员都需要更新一次。

    为了其他人看到这个,Settings | Project: ... | Project Structure | Exclude files 还有一个更常见的排除列表,它默认为空并且不会跨项目保留

    【讨论】:

    • 谢谢。尽管如此,我想避免每个开发人员都需要这样做。如果目录中的特殊文件会告诉 IDE 停止查看该目录,那就太好了。
    • @guettli 我已经更新了我的答案以提供一个我认为应该满足你要求的解决方案(不是最干净的 IMO,但是......我认为它应该可以工作)
    • 这很酷。所以.reports~ 应该可以工作。谢谢。
    • 我错过了那个。我喜欢那个 - 比我拥有的要多得多。更新列表以包含它
    • 不错的解决方案。也许您可以稍微改写一下这个问题,以便更明显地重命名目录是一种选择,然后接受@nanotek 的回答。 :-)
    【解决方案2】:

    我不知道有哪个文件可以按照您描述的方式工作。但是,您可以查看您的想法的项目文件.idea/<project>.iml(其中<project> 是您的项目名称)。所以假设你的项目名为your-app,那么它可以在.idea/your-app.iml 下找到。它应该像这样描述排除的文件夹:

      <component name="NewModuleRootManager">
        <content url="file://$MODULE_DIR$">
          <excludeFolder url="file://$MODULE_DIR$/.reports" />
        </content>
      </component>
    

    您可以创建存储库的新克隆,在 PyCharm 中打开它,排除文件夹并提交 your-app.iml 文件。

    它并不完美,因为它可能会在您的同事签出时覆盖他们的设置,但它基本上为他们提供了一个排除该文件夹的模板文件。然后您可能应该将该文件添加到.gitignore 文件中,这样以后就不会有人覆盖共享文件了:

    # .gitignore
    # exclude .idea folder
    .idea/
    
    # or just the file
    .idea/your-app.iml
    

    如果文件已被 git 忽略,您可能需要使用 force 标志添加它:

    git add -f .idea/your-app.iml
    

    在这种情况下,您之后可能不必将其添加到任何 .gitignore 文件中。

    注意:我没有对此进行测试。我预计它可能会为已经在本地存储库中拥有它的开发人员引入冲突或覆盖 your-app.iml 文件。它可能最适合项目。

    【讨论】:

    • 我正在寻找一种自动排除目录的方法,因为我们有几个开发人员,每个开发人员都有几个项目。你的解决方案可以自动化吗?
    • 可以,但是由于每个项目的名称都会发生变化,这并不简单,而且我不确定文件的 整个 内容是否可以轻松生成。我希望它需要一个复杂的脚本,或者每个存储库的一些一次性用户交互。
    【解决方案3】:

    您可以使用如下代码编辑项目.idea/&lt;project-name&gt;.iml

    编辑IML文件的代码

    from pathlib import Path
    import xml.etree.ElementTree as et
    
    EXCLUDE_PREFIX = 'file://$MODULE_DIR$'
    idea_dir = Path('.idea')  # pycharm stores the project files in .idea
    project_file = next(idea_dir.glob('*.iml'), None) if idea_dir.exists() else None
    
    if project_file is None:
        # we expect to be in the project root directory
        exit(1)
    
    project_file = project_file.resolve()
    tree = et.parse(project_file)
    module_dir = tree.find(".//content[@url='file://$MODULE_DIR$']")
    
    if module_dir is None:
        # add a node for the NewModuleRootManager
        root_manager = tree.find(".//component[@name='NewModuleRootManager']")
        module_dir = et.SubElement(root_manager, 'content', url='file://$MODULE_DIR$')
    
    # find which exclude directories we need to add
    existing_excludes = {Path(f.attrib['url'].replace(EXCLUDE_PREFIX, '.'))
                         for f in module_dir.findall("excludeFolder")}
    desired_excludes = {f.parent for f in idea_dir.parent.rglob('.pycharm-exclude')}
    new_excludes = sorted(f'{EXCLUDE_PREFIX}/{f}' for f in desired_excludes - existing_excludes)
    
    # add the needed exclude directories and save the file
    if new_excludes:
        for exclude in new_excludes:
            et.SubElement(module_dir, 'excludeFolder', url=exclude)
        et.indent(tree)  # this expects python 3.9
        tree.write(str(project_file), xml_declaration=True, encoding='UTF-8')
    

    这是如何工作的?

    项目.iml文件是xml。我们可以使用etree 读取XML,然后进行相应的编辑。直接查找我们的标记文件,然后根据需要将 excludeFolder 节点添加到 xml 中。 .iml 文件 xml 的相关部分如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <module type="PYTHON_MODULE" version="4">
      <component name="NewModuleRootManager">
        <content url="file://$MODULE_DIR$">
          <excludeFolder url="file://$MODULE_DIR$/exclued_dir" />
        </content>
      </component>
    </module>
    

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多