Снаряд з кешуванням не любить нові файли


9

Я використовую снаряд для перегляду свого проекту. Я бачив, що це дуже повільно, тому я ввімкнув кешування. Зараз це швидко (не плачевно швидко, сумно).

Якщо я сам створюю новий файл поза emacs, снаряд його не знаходить. Я можу запустити недійсність кешу, але це займає кілька хвилин. Як це виправити?


Ви можете відкрити файл і додати його в кеш вручну M-x projectile-cache-current-file. Якщо ви не хочете, то Emacs повинен обходити все дерево, шукаючи файли, тому оптимізації не можна робити.
PythonNut

1
Я пропоную відкрити запит на функцію підтримки вбудованої filenotify.elбібліотеки, який, на мою думку, дозволить снаряду відстежувати зміни каталогів і, отже, повідомлятись про те, коли буде створено (або видалено) новий файл (або каталог для відстеження), щоб він міг автоматично додавати (або видаліть) файли до / з кешу. Повідомлення каталогів не є рекурсивними, тому ця функція тягне за собою незалежне відстеження кожного каталогу в проекті. Я не знаю, чи це спричинило б якісь помітні штрафи за велике дерево проекту.
phils

Відповіді:


4

Використовуйте аргумент префікса, тобто C-u C-c p fшвидко визнати недійсним і знайти файли в проекті. Пропозиція в коментарі щодо використання projectile-cache-current-fileтехнічно правильна, але є гак, find-fileякий автоматично викликає це в кожному новому відкритому файлі. Це буде найшвидшим рішенням без виправдання наявного кешу.

Однак це здається справжньою проблемою: чи потрібно занадто багато часу, щоб відновити кеш, обходячи дерево. Для цього допоможе, якби було трохи більше інформації про ваше оточення. За замовчуванням projectile-indexing-methodвстановлено у 'nativeWindows, що надає перевагу елісипській реалізації, findоскільки воно є більш портативним. В іншому випадку він використовує 'alienметод, тобто git ls, findі т. Д. Якщо ви перебуваєте в Linux, метод інопланетян увімкнено за замовчуванням.

В іншому випадку ви можете переслідувати кролячу нору projectile-get-repo-filesта projectile-get-ext-command. Вони визначають, де снаряд шукає список файлів. Можливо, ви могли б замінити це за допомогою dir-locals або тому подібного, щоб застосувати швидший спосіб пошуку.


2

Це не прискорює кешування файлів, але це заощаджує крок вручну необхідності визнання недійсним кеш-пам'яті (який не містить нового файлу).

Снаряд автоматично визнає недійсним кеш, якщо /your/projectile/project/root/.projectileфайл новіший, ніж файл кешу проекту.

Ця перевірка робиться кожного разу, коли ви намагаєтесь знайти будь-який файл у проекті за допомогою снаряда; projectile-find-fileабо C-c p fякщо одна з команд, яка робить цю перевірку спочатку.

(defun projectile-maybe-invalidate-cache (force)
  "Invalidate if FORCE or project's dirconfig newer than cache."
  (when (or force (file-newer-than-file-p (projectile-dirconfig-file)
                                           projectile-cache-file))
    (projectile-invalidate-cache nil)))

- З projectile.elджерела - рядки 575-579

Тож рішення полягає touchу .projectileфайлі, коли ви оновлюєте проект. Наприклад, ви можете aliasзробити git commit, git pullі т.д., щоб зробити

touch /your/projectile/project/root/.projectile` 

зробивши все, що ви робили з gitкомандами.

Тож якщо хтось із вашої команди додасть новий файл до проекту та (якщо ви використовуєте git для контролю версій), ви використовуєте спеціальний псевдонім git pull, кеш буде автоматично недійсним, коли ви зробите projectile-find-fileнаступний раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.