Shared environments?

Exactly, that is part of it, with some additions: that using should install the package locally available only. If the user never added the package, I think it is fine to error.

And, in the REPL, the output of the command should be cleaner, it should “almost” feel like a using from the shared @v1.7 environment. Maybe with one line of warning.

I think that is a great way to introduce the environments as a feature, and important feature.

I also tested the MWEs in the base environment, until it became a mess. From then on, I start a new temporary environment every time for that. And I would love to be able to save those at the end.

The more I use Julia, the more I feel that the base environment is like a root account, which I should be very careful in using, where changes can cause widespread confusion in all my development workflows. I feel thus that it should be hidden, not exposed, by default.

So something like automatically install packages when locally available.
Maybe this can be achieved with Pkg.offline()

julia> import Pkg

julia> Pkg.offline()

julia> using Unitful
 │ Package Unitful not found, but a package named Unitful is available from a registry. 
 │ Install package?
 │   (jl_jMsi1H) [offline] pkg> add Unitful 
 └ (y/n) [y]: 
   Resolving package versions...
    Updating `/tmp/jl_jMsi1H/Project.toml`
  [1986cc42] + Unitful v1.11.0
    Updating `/tmp/jl_jMsi1H/Manifest.toml`
  [187b0558] + ConstructionBase v1.3.0
  [1986cc42] + Unitful v1.11.0
  [56f22d72] + Artifacts
  [ade2ca70] + Dates
  [8f399da3] + Libdl
  [37e2e46d] + LinearAlgebra
  [de0858da] + Printf
  [9a3f8284] + Random
  [ea8e919c] + SHA
  [9e88b42a] + Serialization
  [4ec0a83e] + Unicode
  [e66e0078] + CompilerSupportLibraries_jll
  [4536629a] + OpenBLAS_jll
  [8e850b90] + libblastrampoline_jll

julia> using Javis
ERROR: ArgumentError: Package Javis not found in current path:
- Run `import Pkg; Pkg.add("Javis")` to install the Jarvis package.


1 Like

Yes, the tools are there, this is what I mention here: Speculations about the default environment (or a new draft environment) - #3 by lmiq

Would be mostly about deciding what the default behavior should be.

1 Like

I am not sure how one would force the automatic installation when not using the REPL.

For a first try one can use the startup.jl file to configure the default behavior.

startup.jl

import Pkg
Pkg.offline()
Pkg.activate(temp=true)

macro using_and_add(pkg)
    quote
        #TODO check if installed
        Pkg.add($(string(pkg)))
        using $pkg
    end 
end

With this, one would have to use @using_and_add Package instead of using Package, but it also works if only a file is executed.

1 Like

So exactly. What would be the downsides of behaving like that?

With that, if the package is not installed anywhere, we can tell the user to install it.

My idea was to have that behavior activated by a draft environment. For instance, the user would do:

% julia --draft

and the environment would be a temporary environment with those options turned on, but where instead of the new macro, the using command would behave like that. With that, scripts would not be environment-specific.

With the additional feature of having a save_environment("my_new_env") feature, with the proper information that then the environment is bounded to the versions of the packages in use at that time (with the advantages that that may bring).

(then I think that this would be a nicer default behavior than the current one, but that’s another story).

One could write that:

A draft environment is fresh environment designed for experimenting and using Julia scripts. It tries to be responsive by not downloading new package versions if local installed versions are available. Adding new packages or updating previous packages must be an explicit action, and require a working internet connection. A draft can be saved into a full featured reproducible environment, in which the package versions used are annotated, with save_env("@new_env"). Draft environments are a good alternative to run package tutorials, plotting, and other tasks that require perhaps large packages to be loaded, but do not involve a heavy involved development workflow.

1 Like

To save the project this might work:

function save_environment(target) 
   isdir(target) && cp(Base.active_project(),joinpath(target,"Project.toml"))
end
1 Like

With the exception of the command line flag, could this be implemented in a package?

Yes, although I don’t know if it is possible to modify the behavior of using (keyword).
Also, I think one would need to call the package to activate the changes.
Maybe one can make a make_persistent function, which modifies the startup.jl

Having a package that does those things would be nice, even to experiment how it feels. Even if it is not possible to overwrite using, maybe having @reuse or something like that can provide an idea if the workflow is nice. For instance, one could play around with:

using Draft
@reuse Plots, DifferentialEquations
...

without worrying about bloating anything, etc.

1 Like

Yea that’s what I had in mind. I think I’d definitely get some utility out of something like this

1 Like

I could try to piece something together. It would probably look like this:

module OfflineEnvironment
   import Pkg
  
   export save_environment, @using_and_add

   function __init__()
      Pkg.offline()
      Pkg.activate(temp=true)
   end

   # helper
   function save_environment(target) 
       isdir(target) && cp(Base.active_project(),joinpath(target,"Project.toml"))
   end

   macro using_and_add(pkg)
        quote
            #TODO check if installed
            Pkg.add($(string(pkg)))
            using $pkg
        end 
    end

end
2 Likes

Any ideas for a better name?

One nice thing would be to simplify the output of @reuse (or @using_and_add), to something clean and just informative of the version of the package being “installed”, instead of…

(from a functional point of view that seems to do the work quite well :slight_smile: )

julia> @reuse Plots
   Resolving package versions...
    Updating `/tmp/jl_j00WX4/Project.toml`
  [91a5bcdd] + Plots v1.27.1
    Updating `/tmp/jl_j00WX4/Manifest.toml`
  [79e6a3ab] + Adapt v3.3.3
  [d360d2e6] + ChainRulesCore v1.14.0
  [9e997f8a] + ChangesOfVariables v0.1.2
  [35d6a980] + ColorSchemes v3.17.1
  [3da002f7] + ColorTypes v0.11.0
  [5ae59095] + Colors v0.12.8
  [34da2185] + Compat v3.42.0
  [d38c429a] + Contour v0.5.7
  [9a962f9c] + DataAPI v1.9.0
  [864edb3b] + DataStructures v0.18.11
  [e2d170a0] + DataValueInterfaces v1.0.0
  [ffbed154] + DocStringExtensions v0.8.6
  [c87230d0] + FFMPEG v0.4.1
  [53c48c17] + FixedPointNumbers v0.8.4
  [59287772] + Formatting v0.4.2
  [28b8d3ca] + GR v0.64.0
  [5c1252a2] + GeometryBasics v0.4.2
  [42e2da0e] + Grisu v1.0.2
  [cd3eb016] + HTTP v0.9.17
  [83e8ac13] + IniFile v0.5.1
  [3587e190] + InverseFunctions v0.1.3
  [92d709cd] + IrrationalConstants v0.1.1
  [c8e1da08] + IterTools v1.4.0
  [82899510] + IteratorInterfaceExtensions v1.0.0
  [692b3bcd] + JLLWrappers v1.4.1
  [682c06a0] + JSON v0.21.3
  [b964fa9f] + LaTeXStrings v1.3.0
  [23fbe1c1] + Latexify v0.15.13
  [2ab3a3ac] + LogExpFunctions v0.3.10
  [1914dd2f] + MacroTools v0.5.9
  [739be429] + MbedTLS v1.0.3
  [442fdcdd] + Measures v0.3.1
  [e1d29d7a] + Missings v1.0.2
  [77ba4419] + NaNMath v1.0.0
  [bac558e1] + OrderedCollections v1.4.1
  [69de0a69] + Parsers v2.2.4
  [ccf2f8ad] + PlotThemes v2.0.1
  [995b91a9] + PlotUtils v1.2.0
  [91a5bcdd] + Plots v1.27.1
  [21216c6a] + Preferences v1.2.5
  [3cdcf5f2] + RecipesBase v1.2.1
  [01d81517] + RecipesPipeline v0.5.1
  [189a3867] + Reexport v1.2.2
  [05181044] + RelocatableFolders v0.1.3
  [ae029012] + Requires v1.3.0
  [6c6a2e73] + Scratch v1.1.0
  [992d4aef] + Showoff v1.0.3
  [a2af1166] + SortingAlgorithms v1.0.1
  [90137ffa] + StaticArrays v1.4.3
  [82ae8749] + StatsAPI v1.2.1
  [2913bbd2] + StatsBase v0.33.16
  [09ab397b] + StructArrays v0.6.5
  [3783bdb8] + TableTraits v1.0.1
  [bd369af6] + Tables v1.7.0
  [5c2747f8] + URIs v1.3.0
  [1cfade01] + UnicodeFun v0.4.1
  [41fe7b60] + Unzip v0.1.2
  [6e34b625] + Bzip2_jll v1.0.8+0
  [83423d85] + Cairo_jll v1.16.1+1
  [5ae413db] + EarCut_jll v2.2.3+0
  [2e619515] + Expat_jll v2.4.8+0
  [b22a6f82] + FFMPEG_jll v4.4.0+0
  [a3f928ae] + Fontconfig_jll v2.13.93+0
  [d7e528f0] + FreeType2_jll v2.10.4+0
  [559328eb] + FriBidi_jll v1.0.10+0
  [0656b61e] + GLFW_jll v3.3.6+0
  [d2c73de3] + GR_jll v0.64.0+0
  [78b55507] + Gettext_jll v0.21.0+0
  [7746bdde] + Glib_jll v2.68.3+2
  [3b182d85] + Graphite2_jll v1.3.14+0
  [2e76f6c2] + HarfBuzz_jll v2.8.1+1
  [aacddb02] + JpegTurbo_jll v2.1.2+0
  [c1c5ebd0] + LAME_jll v3.100.1+0
  [88015f11] + LERC_jll v3.0.0+1
  [dd4b983a] + LZO_jll v2.10.1+0
  [e9f186c6] + Libffi_jll v3.2.2+1
  [d4300ac3] + Libgcrypt_jll v1.8.7+0
  [7e76a0d4] + Libglvnd_jll v1.3.0+3
  [7add5ba3] + Libgpg_error_jll v1.42.0+0
  [94ce4f54] + Libiconv_jll v1.16.1+1
  [4b2f31a3] + Libmount_jll v2.35.0+0
  [89763e89] + Libtiff_jll v4.3.0+1
  [38a345b3] + Libuuid_jll v2.36.0+0
  [e7412a2a] + Ogg_jll v1.3.5+1
  [458c3c95] + OpenSSL_jll v1.1.14+0
  [91d4177d] + Opus_jll v1.3.2+0
  [2f80f16e] + PCRE_jll v8.44.0+0
  [30392449] + Pixman_jll v0.40.1+0
  [ea2cea3b] + Qt5Base_jll v5.15.3+0
  [a2964d1f] + Wayland_jll v1.19.0+0
  [2381bf8a] + Wayland_protocols_jll v1.25.0+0
  [02c8fc9c] + XML2_jll v2.9.12+0
  [aed1982a] + XSLT_jll v1.1.34+0
  [4f6342f7] + Xorg_libX11_jll v1.6.9+4
  [0c0b7dd1] + Xorg_libXau_jll v1.0.9+4
  [935fb764] + Xorg_libXcursor_jll v1.2.0+4
  [a3789734] + Xorg_libXdmcp_jll v1.1.3+4
  [1082639a] + Xorg_libXext_jll v1.3.4+4
  [d091e8ba] + Xorg_libXfixes_jll v5.0.3+4
  [a51aa0fd] + Xorg_libXi_jll v1.7.10+4
  [d1454406] + Xorg_libXinerama_jll v1.1.4+4
  [ec84b674] + Xorg_libXrandr_jll v1.5.2+4
  [ea2f1a96] + Xorg_libXrender_jll v0.9.10+4
  [14d82f49] + Xorg_libpthread_stubs_jll v0.1.0+3
  [c7cfdc94] + Xorg_libxcb_jll v1.13.0+3
  [cc61e674] + Xorg_libxkbfile_jll v1.1.0+4
  [12413925] + Xorg_xcb_util_image_jll v0.4.0+1
  [2def613f] + Xorg_xcb_util_jll v0.4.0+1
  [975044d2] + Xorg_xcb_util_keysyms_jll v0.4.0+1
  [0d47668e] + Xorg_xcb_util_renderutil_jll v0.3.9+1
  [c22f9ab0] + Xorg_xcb_util_wm_jll v0.4.1+1
  [35661453] + Xorg_xkbcomp_jll v1.4.2+4
  [33bec58e] + Xorg_xkeyboard_config_jll v2.27.0+4
  [c5fb5394] + Xorg_xtrans_jll v1.4.0+3
  [3161d3a3] + Zstd_jll v1.5.2+0
  [0ac62f75] + libass_jll v0.15.1+0
  [f638f0a6] + libfdk_aac_jll v2.0.2+0
  [b53b4c65] + libpng_jll v1.6.38+0
  [f27f6e37] + libvorbis_jll v1.3.7+1
  [1270edf5] + x264_jll v2021.5.5+0
  [dfaa095f] + x265_jll v3.5.0+0
  [d8fb68d0] + xkbcommon_jll v0.9.1+5
  [0dad84c5] + ArgTools
  [56f22d72] + Artifacts
  [2a0f44e3] + Base64
  [ade2ca70] + Dates
  [8bb1440f] + DelimitedFiles
  [8ba89e20] + Distributed
  [f43a241f] + Downloads
  [b77e0a4c] + InteractiveUtils
  [b27032c2] + LibCURL
  [76f85450] + LibGit2
  [8f399da3] + Libdl
  [37e2e46d] + LinearAlgebra
  [56ddb016] + Logging
  [d6f4376e] + Markdown
  [a63ad114] + Mmap
  [ca575930] + NetworkOptions
  [44cfe95a] + Pkg
  [de0858da] + Printf
  [3fa0cd96] + REPL
  [9a3f8284] + Random
  [ea8e919c] + SHA
  [9e88b42a] + Serialization
  [1a1011a3] + SharedArrays
  [6462fe0b] + Sockets
  [2f01184e] + SparseArrays
  [10745b16] + Statistics
  [fa267f1f] + TOML
  [a4e569a6] + Tar
  [8dfed614] + Test
  [cf7118a7] + UUIDs
  [4ec0a83e] + Unicode
  [e66e0078] + CompilerSupportLibraries_jll
  [deac9b47] + LibCURL_jll
  [29816b5a] + LibSSH2_jll
  [c8ffd9c3] + MbedTLS_jll
  [14a3606d] + MozillaCACerts_jll
  [4536629a] + OpenBLAS_jll
  [83775a58] + Zlib_jll
  [8e850b90] + libblastrampoline_jll
  [8e850ede] + nghttp2_jll
  [3f19e933] + p7zip_jll

julia> 

1 Like

I like Draft and @reuse

1 Like

https://github.com/feanor12/Draft.jl

To test see the install section.
It is not registered yet, so feedback is welcome.

4 Likes