Обновление (перезагрузка) пакета Mathematica после изменений
Я пытаюсь найти ярлык для следующего цикла. При разработке пакета Mathematica каждый вносит изменения в .m
код файла, а затем хотите проверить изменения в другой записной книжке. Это бесконечный цикл...
Итак, у нас есть пакет package.m
и тетрадь test_package.nb
где тестирование сделано. В настоящее время, когда я что-то изменить в .m
файл, я тогда должен:
Quit[]
Needs["package`"]
в блокноте, чтобы изменения стали доступны, чтобы я мог их протестировать. Похоже без Quit[]
это не работает
Есть ли более короткий способ повторить этот цикл разработки? В частности, избегать отказа от курения?
отава
Если бы я мог, я бы принял ответы как Рубенко, так и Леонида, так как они полезны и решают мою проблему. Однако, поскольку можно выбрать только один ответ, я выбрал Рубенко из-за простоты и легкости - просто изменив Needs
в Get
Я преодолел свою проблему. Тем не менее, пакет Леонида, безусловно, более сложный и, вероятно, в конце дня дает лучшие результаты, но он должен быть установлен, загружен и т. Д.
3 ответа
Используйте Get; Нужно только грузить пакет, если он не загружен вообще. Иногда вам нужно быть осторожным и использовать ClearAll для переменных в пакете.
В качестве альтернативы использованию простого Get
, как подсказывает @ruebenko (это хороший совет), вы можете попробовать использовать пакет, который я написал под названием PackageManipulations`
, который делает то, что вы хотите. Это доступно здесь. Есть блокнот с примерами, иллюстрирующими, как это работает, также на странице, на которую я ссылаюсь. Пакет может перезагрузить, очистить или удалить данный пакет (контекст). Функция PackageReload
конкретно буду делать что хочешь.
Это использует Get
или же Needs
под капотом, но, кроме того, он будет отслеживать так называемые "экранирующие символы" (символы, которые экспортируются публично, но не имеют сообщений об использовании и могут "протекать" детали реализации), и при желании может решить проблемы с теневым копированием в пользу повторной загрузки пакета. Обратите внимание, что PackageReload
автоматически позвонит Unprotect
а также ClearAll
на символах пакета, таким образом решая проблему, упомянутую @ruebenko. Вы можете найти более подробную информацию в примере тетради, который поставляется с пакетом.
Обратите внимание, что, хотя я сам использовал его много раз, я не утверждаю, что он не содержит ошибок:)
Самый простой способ - это использовать Clear
или, еще лучше, ClearAll
на открытые символы в вашем пакете в самом начале вашего пакета, как показано ниже
BeginPackage["SomePackage`"];
ClearAll[ ASymbol, AnotherSymbol, ...];
Это гарантирует, что у вас будет чистый лист, когда вы его загрузите. Это проще, когда пакет становится более стабильным, но я обнаружил, что если я не сделаю этого, когда я первоначально разрабатываю пакет, это не будет сделано.