<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Personally, when working with Haskell, I miss very much the Gophers' pragmatic attitude in building projects from source, the redundancy of specifications is reduced to extreme where possible, then you usually only need to care about each individual source file. Even with recent [Go Modules](<a href="https://golang.org/ref/mod" class="">https://golang.org/ref/mod</a>) mechanism, the norm is to edit source files then your `go.mod` file is maintained by tools automatically, you can fix it when auto-updates went wrong, but never have to maintain it yourself. Cabal's principle seems rather cautious in comparison, it worries about you be making mistakes to mis-express your intention by accident, so require warrant of your actions by supplying consistent information allover different places with possibly multiple pieces of submission containing redundant information. It is crucial to need 2 (or more) keys for a nuclear weapon launching panel to be triggerable, but building a project? I think we can take that a lot easier.<div class=""><br class=""></div><div class="">I suppose the really hard part of a modern build system is neither compiling/linking nor even project local dependency anymore, it is management of external dependencies now. I'm happy to see Cabal v2 took Nix as the example to follow, but yet there are still huge spaces for improvement in ergonomics respects. I don't expect Haskell/GHC to be that popular like JavaScript/NodeJS, [npm](<a href="https://www.npmjs.com/" class="">https://www.npmjs.com/</a>) in a sense may be too successful in ergonomics, that local disk capacity of a developer's machine becomes the sole bottleneck, but there are things definitely improvable after Nix style building modes, so I anticipate a Cabal v3 sooner than later.</div><div class=""><br class=""></div><div class="">Sincerely,</div><div class="">Compl<br class=""><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 2020-12-10, at 19:23, Ignat Insarov <<a href="mailto:kindaro@gmail.com" class="">kindaro@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class=""># Do something about Cabal?<br class=""><br class="">Hello.<br class=""><br class="">Cabal is the second most used tool in Haskell after GHC. It has many<br class="">problems. It may be noticed that there is one and a half developers working on<br class="">it. This is clearly not enough to address these problems. I propose that this is<br class="">a good place to invest in.<br class=""><br class="">### Problems I have in mind:<br class=""><br class="">* Poor communication, lack of open source development process.<br class=""><br class=""> The whole Cabal–Stack schism appears to be an outcome of poor<br class=""> communication. One of the leading developers of Cabal is even banned from<br class=""> participation somewhere in Stack circles.[1] Personally, I reported several<br class=""> issues to Cabal and every single time it resulted in sadness. Observe a<br class=""> vicious circle: core developers are overworked ⇒ they are being unfriendly ⇒<br class=""> there are fewer contributors ⇒ core developers are overworked.<br class=""><br class=""> I have no hard evidence but it appears that presently, more people that strive<br class=""> to improve the Haskell build experience are outside the Cabal cabal than are<br class=""> inside.<br class=""><br class="">* User experience is an afterthought.<br class=""><br class=""> Cabal's user experience is horrifying. A collection of complaints is being<br class=""> compiled elsewhere.[2] There are also bugs being opened to Cabal because of<br class=""> this, requiring triage and therefore wasting the precious time of the few<br class=""> overworked developers. Stack is much more friendly — this shows by example<br class=""> that the user experience problem is not inherent and may be solved.<br class=""><br class=""> It is ordinary to receive output like this:<br class=""><br class=""> ```<br class=""> % cabal run example-executable<br class=""> Warning: The package list for '<a href="http://hackage.haskell.org" class="">hackage.haskell.org</a>' is 84 days old.<br class=""> Run 'cabal update' to get the latest list of available packages.<br class=""> Resolving dependencies...<br class=""> cabal: Could not resolve dependencies:<br class=""> [__0] trying: example-0.1.0.6 (user goal)<br class=""> [__1] next goal: opaleye (dependency of example)<br class=""> [__1] rejecting: opaleye-0.7.1.0, opaleye-0.7.0.0 (constraint from project<br class=""> config TODO requires ==0.6.7006.1)<br class=""> [__1] rejecting: opaleye-0.6.7006.1 (conflict: example => opaleye^>=0.7)<br class=""> [__1] skipping: opaleye-0.6.7006.0, opaleye-0.6.7005.0, opaleye-0.6.7004.2,<br class=""> opaleye-0.6.7004.1, opaleye-0.6.7004.0, opaleye-0.6.7003.1,<br class=""> opaleye-0.6.7003.0, opaleye-0.6.1.0, opaleye-0.6.0.0, opaleye-0.5.4.0,<br class=""> opaleye-0.5.3.1, opaleye-0.5.3.0, opaleye-0.5.2.2, opaleye-0.5.2.0,<br class=""> opaleye-0.5.1.1, opaleye-0.5.1.0, opaleye-0.5.0.0, opaleye-0.4.2.0,<br class=""> opaleye-0.4.1.0, opaleye-0.4.0.0, opaleye-0.3.1.2, opaleye-0.3.1, opaleye-0.3,<br class=""> opaleye-0.2, opaleye-0.6.7002.0, opaleye-0.6.7001.0, opaleye-0.6.7000.0,<br class=""> opaleye-0.5.2.1, opaleye-0.3.1.1 (has the same characteristics that caused the<br class=""> previous version to fail: excluded by constraint '^>=0.7' from example)<br class=""> [__1] fail (backjumping, conflict set: example, opaleye)<br class=""> After searching the rest of the dependency tree exhaustively, these were the<br class=""> goals I've had most trouble fulfilling: opaleye, example<br class=""> ```<br class=""><br class=""> There are so many things that are wrong here. Even a sneaky _«to do»_<br class=""> remark. If you wonder, in this case the solution is to remove and re-generate<br class=""> `cabal.project.freeze`.<br class=""><br class=""> Even the name of the program — it is actually _«cabal-install»_ — is<br class=""> incomprehensible, it should be re-branded to Cabal, which is how everyone<br class=""> calls it anyway.<br class=""><br class="">* Features are not being introduced.<br class=""><br class=""> There is no reason for two build tools to exist. The killer feature of Stack —<br class=""> snapshots — should be supported by Cabal. Possibly Cabal itself should be<br class=""> refactored and split so that there are separate tools for packaging, version<br class=""> resolution and human interaction — I do not know. But certainly the way things<br class=""> are presently is a waste of developer effort and a source of confusion for<br class=""> everyone.<br class=""><br class="">### My proposition, in particular.<br class=""><br class="">* Ask all the people that show compassion to the cause of a great Haskell build<br class=""> tool to unite and work together on a better Cabal. This includes the<br class=""> developers of Stack and everyone that expressed unhappiness with the current<br class=""> state of Cabal. These people should be seen as a blessing, not as an obstacle.<br class="">* Put in place a clear process for contributing and decision making, so that it<br class=""> does not come down to the privileged opinion of one of the core developers.<br class="">* Make a model of user experience that Cabal should conform to, and make<br class=""> conformance a priority. Surely there are among us people that know a thing or<br class=""> two about user experience — call for them to step forward. Every issue that<br class=""> stems from misunderstanding, re-assign to the model instead of closing.<br class="">* Merge the support of Stackage snapshots into Cabal. Ask the core developers of<br class=""> Stack to join the effort. Transition from Stack to Cabal should be one well<br class=""> discoverable command that just works.<br class=""><br class="">I realize that this letter is largely an opinion piece. You can also see it as<br class="">an _«ideal piece»_. Without an ideal, without a vision, we are stuck with the<br class="">present. I do not insist that my vision is the best. But the present reality is<br class="">not the best vision either. I propose, foremost, that we work and fight for a<br class="">better future.<br class=""><br class="">[1]: <a href="https://github.com/commercialhaskell/stackage/issues/4472" class="">https://github.com/commercialhaskell/stackage/issues/4472</a><br class="">[2]: <a href="https://github.com/tomjaguarpaw/tilapia/issues?q=is%3Aissue+is%3Aopen+cabal" class="">https://github.com/tomjaguarpaw/tilapia/issues?q=is%3Aissue+is%3Aopen+cabal</a><br class="">_______________________________________________<br class="">Haskell-Cafe mailing list<br class="">To (un)subscribe, modify options or view archives go to:<br class=""><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" class="">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br class="">Only members subscribed via the mailman list are allowed to post.</div></div></blockquote></div><br class=""></div></div></body></html>