-
Notifications
You must be signed in to change notification settings - Fork 849
Description
Hi! I recently discovered that stack is modifying the $PATH variable when you ran any command. More precisely it prepends to it {local-install-root}/bin and {snapshot-install-root}/bin.
It is interfering with an actual use case in haskell-ide-engine. We are using a script to perform the installation of the tool and one of the commands installs the appropiate version of cabal in local-bin-dir (that hopefully is in $PATH).
The issue is once you have installed it the first time, stack put it in {snapshot-install-root}/bin and all subsequent calls to the script using stack use that cached version of cabal and no the original executable in user $PATH (wherever it is).
That behaviour causes:
- If you delete the
cabalexecutable in$PATHafter installing it with the script, another invocation doesn't copy again thecabalexecutable, cause the version cached by stack is found (usingDirectory.findExecutable). - All executions of the script that eventually execute
cabaluse that cached version and no the original one, so f.e. if you upgrade manually yourcabalin$PATHto3.0.0.0the script will continue using the cached version, (currently2.4.1.0)
The unique workaround i've got is to manually remove those paths from $PATH and run all cabal executions and Directory.findExecutable without them:
withoutStackCachedBinaries action = do
mbPath <- liftIO (lookupEnv "PATH")
case (mbPath, isRunFromStack) of
(Just paths, True) -> do
snapshotDir <- trimmedStdout <$> execStackShake ["path", "--snapshot-install-root"]
localInstallDir <- trimmedStdout <$> execStackShake ["path", "--local-install-root"]
let cacheBinPaths = [snapshotDir </> "bin", localInstallDir </> "bin"]
let origPaths = removePathsContaining cacheBinPaths paths
liftIO (setEnv "PATH" origPaths)
a <- action
liftIO (setEnv "PATH" paths)
return a
otherwise -> action
where ....Clearly it is an ugly and brittle hack so do you know another better way to accomplish it?
In case there is no one, could be added some way to optionally bypass the stack modifications of the $PATH variable?
(NOTE: i am aware that the modification of the $PATH variable is absolutely required to not break stack builds, optionally bypassing it only would make sense inside stack run script.hs or maybe stack exec whatever. A possible improvement could be save the original path to another environment variable with a specific name)
Stack version
$ stack --version
Version 2.1.3, Git revision 0fa51b9925decd937e4a993ad90cb686f88fa282 (7739 commits) x86_64 hpack-0.31.2
Method of installation
- Official binary, downloaded from stackage.org or fpcomplete's package repository