【问题标题】:How do I read the build-in Project.toml from a Pluto notebook?如何从 Pluto 笔记本中读取内置 Project.toml?
【发布时间】:2022-11-01 18:32:31
【问题描述】:

我想用本机包管理器实例化内置在 Pluto 笔记本中的 project.toml。我如何从笔记本上读取它?

说,我有一个笔记本,例如,

nb_source = "https://raw.githubusercontent.com/fonsp/Pluto.jl/main/sample/Interactivity.jl"

如何创建一个临时环境,并获取此笔记本项目的包?特别是如何完成以下代码?

cd(mktempdir()) 
import Pkg; Pkg.activate(".") 
import Pluto, Pkg 

nb = download(nb_source, ".") 

### Some code using Pluto's build in package manager 
### to read the Project.toml from nb --> nb_project_toml 

cp(nb_project_toml, "./Project.toml", force=true) 
Pkg.instantiate(".")

【问题讨论】:

    标签: package julia pluto


    【解决方案1】:

    因此,首先,您正在查看的笔记本是 Pluto 0.17.0 笔记本,它没有内部包管理器。我认为它是在 Pluto 0.19.0 中添加的。

    这是使用内部 pluto 包的笔记本中最后几个单元格的样子:

    # ╔═╡ 00000000-0000-0000-0000-000000000001
    PLUTO_PROJECT_TOML_CONTENTS = """
    [deps]
    Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
    PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
    PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0"
    Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
    
    [compat]
    Plots = "~1.32.0"
    PlutoUI = "~0.7.40"
    PyCall = "~1.94.1"
    """
    
    # ╔═╡ 00000000-0000-0000-0000-000000000002
    PLUTO_MANIFEST_TOML_CONTENTS = """
    # This file is machine-generated - editing it directly is not advised
    
    julia_version = "1.8.0"
    ...
    

    所以你可以添加类似的东西:

    import(nb)
    write("./Project.toml", PLUTO_PROJECT_TOML_CONTENTS)
    

    这样做的缺点是运行笔记本中的所有代码,这可能需要一段时间。

    或者,您可以阅读笔记本文件,直到找到 # ╔═╡ 00000000-0000-0000-0000-000000000001 行,然后自己解析以下字符串或评估之后的所有内容(类似于 eval(Meta.parse(string_stuff_after_comment)) 应该这样做......)

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      Pluto.load_notebook_nobackup() 读取笔记本的信息。这给出了该领域的部门字典.nbpkg_ctx.env.project.deps

      import Pluto, Pkg 
      Pkg.activate(;temp=true)  
      nb_source = "https://raw.githubusercontent.com/fonsp/Pluto.jl/main/sample/PlutoUI.jl.jl" 
      nb = download(nb_source)
      nb_info = Pluto.load_notebook_nobackup(nb)
      deps = nb_info.nbpkg_ctx.env.project.deps 
      Pkg.add([Pkg.PackageSpec(name=p, uuid=u) for (p, u) in deps])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        相关资源
        最近更新 更多