<div dir="ltr">There are known problems which developers regularry face with cabal-install and stack brings easier and safer workflow for developers, that's true. But I don't see how stack can help developers to understand other aspects<div><br></div><div>When haskellers talk about user installation they really mean sandbox</div><div>When haskellers talk about global installation they mean user installation</div><div>When haskellers talk about system installation their brains blows</div><div><br></div><div>People complain that on Haskell.org there is harmful workflow for developers introducing Haskell Platform and it should be overtaken by stack. (Note that Haskell Platform is system installation used by different users and it can't be messed up with user installation)</div><div><br></div><div>However either `cabal-install` and `stack` worklows are both harmful for users, `stack` does resolve nothing for user side, it just helps you with sandbox managing during development stage.</div><div><br></div><div>I will try to explain.</div><div><br></div><div>Regularly users use package managers (on windows installers) to get what they want, that's how users install python projects, C++ projects, etc... users don't use pip (really they don't)</div><div><br></div><div>What about haskell? On most distributions and Windows users should use what? sandboxes for every program and install those progam for every users avoiding system installation?</div><div><br></div><div>Currently yes. Other ways will be harmful. There is solution from NixOS but I doubt if they've managed to implement revdep rebuild for haskell packages. I like (a lot) solution from gentoo where you can simply run `emerge idris` and everything will be installed on system alike you install some python util (alike portage itself). But even in Gentoo there is dirty hack to manage haskell packages updates.</div><div><br></div><div>it looks really dirty</div><div><pre style="overflow:auto;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:11.9px;margin-top:0px;margin-bottom:16px;font-stretch:normal;line-height:1.45;padding:16px;border-radius:3px;word-wrap:normal;color:rgb(51,51,51);background-color:rgb(247,247,247)"><code style="font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:11.9px;padding:0px;margin:0px;border-radius:3px;border:0px;display:inline;max-width:initial;overflow:initial;line-height:inherit;word-wrap:normal;background:transparent">    haskell-updater -- --jobs="$(($(nproc) + 1))" --verbose-conflicts --backtrack=100
    haskell-updater -- --jobs="$(($(nproc) + 1))" --verbose-conflicts --backtrack=100</code></pre></div><div>basically it's <span style="color:rgb(41,47,51);font-family:Arial,Verdana,sans-serif;font-size:15px;line-height:19.2867px;white-space:pre-wrap;background-color:rgb(234,234,234)">rebuilding all libs depending on changed one then depending on depending incrementally</span></div><div><span style="color:rgb(41,47,51);font-family:Arial,Verdana,sans-serif;font-size:15px;line-height:19.2867px;white-space:pre-wrap;background-color:rgb(234,234,234)"><br></span></div><div>What is it even?<br></div><div><br></div><div><blockquote style="padding:10px 20px;margin:0px 0px 20px;border-left-width:5px;border-left-style:solid;border-left-color:rgb(238,238,238);color:rgb(51,51,51);font-family:"Helvetica Neue Light","Helvetica Neue",Helvetica,sans-serif;line-height:24px"><p style="margin:0px">Haskell programs and libraries extensively reuse entitites (types, functions, rewrite rules, type instances, other stuff) exported from external libraries as non-opaque entities to allow aggressive cross-module inlining to compile away deep layers of abstraction. It’s language’s feature. If you accept the fact transitive dependencies being able to break ABI is not a GHC bug</p></blockquote><blockquote style="padding:10px 20px;margin:0px 0px 20px;border-left-width:5px;border-left-style:solid;border-left-color:rgb(238,238,238);color:rgb(51,51,51);font-family:"Helvetica Neue Light","Helvetica Neue",Helvetica,sans-serif;line-height:24px"><p style="margin:0px">what actually affects real ABI (exported inlines, exported datatype layout changes, modules names, strictness annotations, unpack pragmas) ghc –show-iface can help in tracking ABI drift.</p></blockquote></div><div>So in nutshell it's a feature but when we're fixing linkage for C/C++ we can <span style="color:rgb(51,51,51);font-family:"Helvetica Neue Light","Helvetica Neue",Helvetica,sans-serif;line-height:24px">scan libs for missing shared library dependencies and attempts to fix them by rebuilding broken libs </span></div><div>For haskell we hardly can detect ABI changes and the only way I know currently is `haskell-updater` util and I'm still looking for better solution</div><div><br></div><div><span style="color:rgb(51,51,51);font-family:"Helvetica Neue Light","Helvetica Neue",Helvetica,sans-serif;line-height:24px">For example when one project, for example Idris, start using changed (bumped) library which is shipped with </span><code style="font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:2px 4px;color:rgb(199,37,78);border-radius:4px;line-height:24px;background-color:rgb(249,242,244)">GHC</code><span style="color:rgb(51,51,51);font-family:"Helvetica Neue Light","Helvetica Neue",Helvetica,sans-serif;line-height:24px"> it feels absolutely fine on sandbox But when user will install idris (and that library to system) all other libraries will become broken because their dependencies is changed by that That’s why some core packages has </span><code style="font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:2px 4px;color:rgb(199,37,78);border-radius:4px;line-height:24px;background-color:rgb(249,242,244)">-compat</code><span style="color:rgb(51,51,51);font-family:"Helvetica Neue Light","Helvetica Neue",Helvetica,sans-serif;line-height:24px"> compatibility layers Sure developers tell me that they don’t care and everything works fine in sandboxes and downgrading this library is </span><code style="font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:2px 4px;color:rgb(199,37,78);border-radius:4px;line-height:24px;background-color:rgb(249,242,244)">distro-patch</code><br></div><div><br></div><div>Note that currently either cabal-install and stack has nothing to do with atomic packages managing. Package manager can install, can remove, can update, can track dependies changes and end with working environment without sandbox replacing. Honestly it's very same situation with python or perl with only difference... When I install software written on python I don't need to use `pip` and `Haskell` seems like much harder to package but people everywhere only force you to use really wrong solutions (including community loved stack)</div><div><br></div><div>So my question is generally to community: are we even going to think in direction of users or are we just focus on developers and their sandboxes?</div><div>In second case we need docker for each Haskell project.<br></div><div><br></div><div>Thanks for your attnetion, it's my first post to this mailing list and sorry for my horrible English</div><div>Heather</div></div>