环境从默认环境继承包

时间:2021-03-24 21:59:36

标签: julia dependency-management virtual-environment

注意:这个问题是指 Julia v1.5。当然,理想情况下,任何时候答案都应该同时回答最新版本的问题。

Julia 安装提供了默认环境(例如,@v1.5)。在某个工作目录中运行 Julia 时,可以使用 julia>] activate . 来创建新环境或激活当前环境(以防当前文件夹包含诸如 Project.toml 之类的文件)。

当 Julia 代码在特定环境中运行时,环境定义了可以通过 usingimport 导入哪些包(或模块)。但是,安装在默认环境中的软件包总是可以使用。我还没有看到文档中提到的这个事实(尽管它很可能被提到)并且在花了一些时间追踪丢失的导入后学到了这个“艰难的方式”。

这有好处也有坏处:有时人们觉得需要使用不属于项目的包,例如,用于分析或调试。如果这些安装在默认环境中,则可以在不污染项目依赖项的情况下使用它们。另一方面,尽管项目使用了某个包,但可能会发生忘记将某个包add 加入项目环境的情况。在这种情况下,其他用户无法仅从 Project.tomlManifest.toml 重现必要的环境。 (将非平凡代码添加到在 Julia 启动时运行的 Julia 脚本中也会有这个缺点。

在我看来,有几种方法可以解决这个问题:

  1. 随意使用从默认环境继承的包(以及 Julia 启动时的脚本),并使用 CI 进行大量单元测试以实现可重复性
  2. 切勿将软件包添加到默认环境中。注意不要在 Julia 启动时在脚本中导入包。
  3. 只需在项目/清单文件中包含您想要的所有包,而不管实际存储库代码是否使用它们。

我的问题:是否有更多(更好?)方法来处理这个问题?哪个选择对 Julia 来说是惯用的?

1 个答案:

答案 0 :(得分:3)

LOAD_PATH 负责确定哪些环境组成以形成有效环境。默认情况下,它包括活动环境、默认环境和标准库。

测试,当由 const resizeObserver = React.useRef<ResizeObserver>(new ResizeObserver((entries:ResizeObserverEntry[]) => { // your code to handle the size change })); const resizedContainerRef = React.useCallback((container: HTMLDivElement) => { if (container !== null) { resizeObserver.current.observe(container); } // When element is unmounted, ref callback is called with a null argument // => best time to cleanup the observer else { if (resizeObserver.current) resizeObserver.current.disconnect(); } }, [resizeObserver.current]); return <div ref={resizedContainerRef}> // Your component content here </div>; (或等效的 Pkg.test)激活时,将使用仅由被测试项目组成的无菌加载路径运行。因此,测试只能访问由各自的 pkg> testProject.toml 文件定义的依赖关系图。

在默认环境中包含实用程序(例如分析工具)似乎是标准做法。

如果您不喜欢这种行为,您可以修改启动文件中的 Manifest.toml 以仅包含活动项目。