-
Notifications
You must be signed in to change notification settings - Fork 698
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Better support for running scripts. #7842
Comments
also #7393 |
bikeshedding:
Trying to generalize the behaviour for fake packages and minimize the number of flags, independently of where are being used. |
When else are fake packages used other than to build scripts? edit: This is discussed in issue #6977. I shouldn't comment before coffee. |
Cache folders on different OS's (please correct me if I'm wrong):
It probably makes sense to add a utility function (in Distribution.Simple.Utils?) to get the cache folder. |
@Mikolaj I'm not sure I see the relevance of #7393? @fendor What's the status of the work you were doing on #6149? @jneira re #6977: I'm not sure caching makes sense for other uses of fake package. At the very least you'd need a completely separate scheme for where to place/how to identify cached instances. |
@bacchanalia: re #7393, you complain "it recompiles on every invocation", and |
@Mikolaj running a script with {- cabal:
build-depends: ...
-} while
I don't think this is a good assumption. Scripts and packages have different ergonomics, and when you might prefer one over the doesn't neatly fall on that boundary, for me, anyway. Another consideration is start-up time. On my machine running hello.hs with runghc takes 25ms, while cached cabal run only takes 15ms (and hopefully that could go lower, but that's out of scope) which is important in some applications. |
Fine. And what about |
Stalled. I don't know how much everyone else knows about this feature, so I'll repeat a bit how this currently works: The script section (which is quite literally an executable section from a .cabal file [btw, you can break it if you put Doing the same for |
@Mikolaj That might be preferable in the |
Sure, it's your call as the implementer and, personally, I'd not expend any extra effort (unless minimal) until users express interest. |
No |
Well, i think the goal is clear: avoid script recompilation in each run (as reported in #6354). Imho That behaviour could use underneath the cache of fake-package build products for now. If fake-package is removed it could cache only the executable itself and nothing more. But no cli will be harmed in the process :-) |
i think if we would have the script cached But i think So i would separate these things:
And i would mark the first one as pr welcomed right now if everyone agree |
Currently we have to go over lib:Cabal (as we need to build stuff and that only happens in lib:Cabal), we can't pass an in-memory |
The point of |
@fendor I was just looking at this code. exe:cabal calls itself, which then uses lib:Cabal as a library. I don't really understand why that's necessary and the the original invocation of exe:cabal can't just use the library directly. |
yeah thanks for confirming my guess:
... but it would not be cached, fire up a repl is faster than compiling and we avoid the linker step. For small/medium scripts it would not be noticeable but maybe it will do for big ones. Another approach could be reconsider the remove of fake-package of course Nevertheless i think we could focus in the first step i mentioned above ( if the work in cabal run can be reused later in build and repl, we could extract the relevant code at that moment |
@jneira I agree with you about the way to proceed
|
hmm i think there is an actual machinery in cabal for that, i would try to reuse it if possible |
After discussing with @jneira, the new proposal is change with default behavior without adding flags. There are several reasons for this:
|
Does any have thoughts on |
That's an argument in favor of edit: or maybe not? The argument for |
I had an idea for |
Enable caching of script builds by changing the location of the fake package directory from a tmp directory to: <cabal_dir>/scipt-builds/abs/path/to/script/ Resolves: haskell#6354 WIP: haskell#7842
Added module Distribution.Client.ScriptUtils for code to deal with scripts that is common between commands. WIP: haskell#7842
This changes the behaviour of cabal clean to accept extra args, which it now interprets as script files. The behaviour of cabal clean is the same when given extra args. When given extra args it instead removes the caches for those scripts and also any orphaned caches (caches for which the script no longer exists) In addition this commit changes the cache to use hashes of paths because this significantly simplifies the implementation of clean, and more importantly it prevents collisions when a script has the name of the subdirectory of a previously cached script. WIP: haskell#7842
I think it'd be best to avoid mixing xdg and non-xdg. I think xdg should be adopted as a whole (#680) What about using the store as cache by just installing the fake package as a remote package? The only problem I see is that it could quickly increase the size of the store since it's immutable
or it could be a part of #3333 |
repl starts in the correct directory and points directly to rather than a dummy, so that reloading works properly. There is a downside to the current approach which is that it uses a different fake-project.cabal file from run and build, so it cannot share the same cache with them. WIP: haskell#7842 WIP: haskell#6149
Ready for review: haskell#7851 May close: haskell#7842, haskell#6354, haskell#6149
Enable caching of script builds by changing the location of the fake package directory from a tmp directory to: <cabal_dir>/scipt-builds/abs/path/to/script/ Resolves: haskell#6354 WIP: haskell#7842
Added module Distribution.Client.ScriptUtils for code to deal with scripts that is common between commands. WIP: haskell#7842
This changes the behaviour of cabal clean to accept extra args, which it now interprets as script files. The behaviour of cabal clean is the same when given extra args. When given extra args it instead removes the caches for those scripts and also any orphaned caches (caches for which the script no longer exists) In addition this commit changes the cache to use hashes of paths because this significantly simplifies the implementation of clean, and more importantly it prevents collisions when a script has the name of the subdirectory of a previously cached script. WIP: haskell#7842
repl starts in the correct directory and points directly to rather than a dummy, so that reloading works properly. There is a downside to the current approach which is that it uses a different fake-project.cabal file from run and build, so it cannot share the same cache with them. WIP: haskell#7842 WIP: haskell#6149
Ready for review: haskell#7851 May close: haskell#7842, haskell#6354, haskell#6149
Enable caching of script builds by changing the location of the fake package directory from a tmp directory to: <cabal_dir>/scipt-builds/abs/path/to/script/ Resolves: haskell#6354 WIP: haskell#7842
Added module Distribution.Client.ScriptUtils for code to deal with scripts that is common between commands. WIP: haskell#7842
This changes the behaviour of cabal clean to accept extra args, which it now interprets as script files. The behaviour of cabal clean is the same when given extra args. When given extra args it instead removes the caches for those scripts and also any orphaned caches (caches for which the script no longer exists) In addition this commit changes the cache to use hashes of paths because this significantly simplifies the implementation of clean, and more importantly it prevents collisions when a script has the name of the subdirectory of a previously cached script. WIP: haskell#7842
repl starts in the correct directory and points directly to rather than a dummy, so that reloading works properly. There is a downside to the current approach which is that it uses a different fake-project.cabal file from run and build, so it cannot share the same cache with them. WIP: haskell#7842 WIP: haskell#6149
Ready for review: haskell#7851 May close: haskell#7842, haskell#6354, haskell#6149
Enable caching of script builds by changing the location of the fake package directory from a tmp directory to: <cabal_dir>/scipt-builds/abs/path/to/script/ Resolves: haskell#6354 WIP: haskell#7842
Added module Distribution.Client.ScriptUtils for code to deal with scripts that is common between commands. WIP: haskell#7842
This changes the behaviour of cabal clean to accept extra args, which it now interprets as script files. The behaviour of cabal clean is the same when given extra args. When given extra args it instead removes the caches for those scripts and also any orphaned caches (caches for which the script no longer exists) In addition this commit changes the cache to use hashes of paths because this significantly simplifies the implementation of clean, and more importantly it prevents collisions when a script has the name of the subdirectory of a previously cached script. WIP: haskell#7842
repl starts in the correct directory and points directly to rather than a dummy, so that reloading works properly. There is a downside to the current approach which is that it uses a different fake-project.cabal file from run and build, so it cannot share the same cache with them. WIP: haskell#7842 WIP: haskell#6149
Ready for review: haskell#7851 May close: haskell#7842, haskell#6354, haskell#6149
* Add support for script build caching to cabal run Enable caching of script builds by changing the location of the fake package directory from a tmp directory to: <cabal_dir>/scipt-builds/abs/path/to/script/ Resolves: #6354 WIP: #7842 * Add support for scripts to cabal build. Added module Distribution.Client.ScriptUtils for code to deal with scripts that is common between commands. WIP: #7842 * Add script support to cabal clean. This changes the behaviour of cabal clean to accept extra args, which it now interprets as script files. The behaviour of cabal clean is the same when given extra args. When given extra args it instead removes the caches for those scripts and also any orphaned caches (caches for which the script no longer exists) In addition this commit changes the cache to use hashes of paths because this significantly simplifies the implementation of clean, and more importantly it prevents collisions when a script has the name of the subdirectory of a previously cached script. WIP: #7842 * Add script support to cabal repl repl starts in the correct directory and points directly to rather than a dummy, so that reloading works properly. There is a downside to the current approach which is that it uses a different fake-project.cabal file from run and build, so it cannot share the same cache with them. WIP: #7842 WIP: #6149 * Added changelog for pr #7851 * Fix `cabal run script.hs` issue with --builddir Fixes tests: cabal-testsuite/PackageTests/NewBuild/CmdRun/Script/cabal.test.hs cabal-testsuite/PackageTests/NewBuild/CmdRun/ScriptLiterate/cabal.test.hs * Fixes for `build script` and `repl script` - Fix build issue introduced in 079c5f0, where build was being passed the wrong target filter - Fix repl issue where script didn't work in a project context. - Refactor code to share logic between repl and build/run - Ensure temp directories are only created when needed * Bug fixes relating to script support ScriptUtils: - Hash prefix for cache dirs was applied incorrectly. - Overwriting fake-package files causes repeated work in some cases. CmdClean: - Clean distdir for script when --builddir is passed - Always clean orphans because because there is no good way to specify they should be cleaned. This may be bad behaviour in some obscure cases (a cache is temporarily orphaned and an unrelated clean is run), but at worst results in a cache rebuild. * Add tests for improved script support - Basic script support for build/repl/clean which checks for cached project files - Add check for cached project files to basic run script test - No repeated work for build/build, build/run, run/run, and repl/repl - Clean does not remove cache for existing scripts - Clean does remove orphaned script caches * Fix clean bug uncovered by 5fad121 - clean was trying to read source-builds even if it didn't exist - add test specific to this case with other clean tests * Update documentation for better script support Ready for review: #7851 May close: #7842, #6354, #6149 * Attempt to fix `repl script` on Windows PR #7851 * Attempt to fix remote test failures Test logs showed that the failures where because the tests depended on a module from cabal-install that some ghc versions could not find. Instead of depending on cabal-install, I copied the needed function into Test.Cabal.Prelude (It seemed like an acceptable place for it) PR #7851 * Attempt to fix `repl script` on Windows PR #7851 * Attempt to fix tests on old ghc versions Tests failing on pre-AMP ghcs due to unsanctioned use of (<$>) PR #7851 * Feedback: Update docs and formatting PR #7851 * Feedback: code style changes - remove partial selectors - make a constant for fake-package.cabal PR #7851 * Feedback: make hidden control flow explicit PR #7851 * Feedback: add expected fail script run tests PR #7851 * Fix `repl script` when cwd is deeper than cachedir PR #7851 * Use script in-place for build or run - Set the hs-source-dir to the location of the script for build and run, the same as with repl - This removes the need to copy the script - repl no longer needs a separate cache because all three commands use identical project files - Adds multi-module support to scripts for free (#6787) - Add new build/repl test and run multi-module test PR #7851 * Fix file-locking issue on Windows PR #7851 * Fix script recompilation based on cwd - Pass info about cwd to repl through --repl-options instead of hacking it into the project file. - Improve paths output by makeRelativeCanonical, makeRelativeToDir, and makeRelativeToCwd. - Script multi-module support works, but with warning in repl. - Remove script multi-module mention support in docs. PR #7851 * Make `repl script` respect --repl-no-load * Feedback: minor refactor Move argument truncation from targetStrings out of withScriptContextAndSelectors to runAction PR #7851 * Feedback: refactor and comments for repl options PR #7851 * Don't use hs-source-dirs for scripts. - instead pass absolute path to script in main-is - resolves issue with relative paths on Windows - simplifies code and gives prettier build output - update tests because build output has changed - removes ability to use multi-module scripts (which was never officially endorsed) - remove test for multi-module scripts - add checks for unsupported fields in scripts PR #7851 * Update changelog for PR #7851
cabal run
can run scripts, but the utility of this is limited because under the current design it recompiles on every invocation.I propose adding the following:
~/.local/share
(or os equivalent)~/.local/share/cabal/<abs path of script without extension>/
to avoid collisions--tmp-script-artifacts
(current behaviour. keep as default?)--persist-script-artifacts
(new behaviour)--script-artifact-dir=DIR
(place fake package in user supplied directory)cabal build
andcabal repl
I have done a quick test with hard coded paths, and it works as expected without further changes. The only changes to
run
necessary are to add the flags and pass the correct directory based on them. I haven't scoped out the work needed to add support tobuild
andrepl
, but I assume it would be very similar to how it works now inrun
.The text was updated successfully, but these errors were encountered: