是否有任何Haskell-land相当于Ruby-land的Bundler等.al,如果没有,如何设计如此结构的项目?

tro*_*ine 20 ruby tdd haskell setup-project bundler

读者注意:请耐心等待.我保证会有一个问题.


我有一个问题需要解决并自己思考"哦,我会用Ruby做的."

$ bundle gem problemsolver
      create  problemsolver/Gemfile
      create  problemsolver/Rakefile
      create  problemsolver/.gitignore
      create  problemsolver/problemsolver.gemspec
      create  problemsolver/lib/problemsolver.rb
      create  problemsolver/lib/problemsolver/version.rb
Initializating git repo in /tmp/harang/problemsolver
Run Code Online (Sandbox Code Playgroud)

删除s.add_development_dependency "rspec"in中的注释problemsolver/problemsolver.gemspec然后

$ bundle exec rspec --init
The --configure option no longer needs any arguments, so true was ignored.
  create   spec/spec_helper.rb
  create   .rspec
Run Code Online (Sandbox Code Playgroud)

新的测试进入spec/并且必须在最终的文件中_spec.rb.例如,spec/version_spec.rb

describe 'Problemsolver' do
  it 'should be at version 0.0.1' do
    Problemsolver::VERSION.should == '0.0.1'
  end
end
Run Code Online (Sandbox Code Playgroud)

要运行规范 - 忽略像守卫这样的代码更改运行者 - 这是微不足道的:

$ bundle exec rspec
.

Finished in 0.00021 seconds
1 example, 0 failures
Run Code Online (Sandbox Code Playgroud)

你看不到它,但是这条信息很好地用彩色编码,以便快速"我搞砸了吗?" 扫描?对此非常好的事情:

  • 安装很快,几乎没脑子(尽管弄清楚调用哪些命令并不简单).
  • 源代码树的标准化布局通过新的代码库缩短了熟悉时间,使协作更加简单,并且在选择您已经离开的项目时减少了停留时间.
  • 对工具的高度依赖通过社区分配最佳实践,大致以新项目创建的速度进行.

添加覆盖工具,代码观察者,短信,行为测试工具和其他工具并不困难.


如果人们认为"哦,我会在Haskell中做到这一点",这与情况形成对比是不利的.

$ mkdir problemsolver

$ cd problemsolver/

$ cabal init
Package name [default "problemsolver"]? 
Package version [default "0.1"]? 0.0.1
Please choose a license:
   1) GPL
   2) GPL-2
   3) GPL-3
   4) LGPL
   5) LGPL-2.1
   6) LGPL-3
 * 7) BSD3
   8) MIT
   9) PublicDomain
  10) AllRightsReserved
  11) OtherLicense
  12) Other (specify)
Your choice [default "BSD3"]? 
Author name? Brian L. Troutwine
Maintainer email [default "brian@troutwine.us"]? 
Project homepage/repo URL? 
Project synopsis? Solves a problem.
Project category:
   1) Codec
   2) Concurrency
   3) Control
   4) Data
   5) Database
   6) Development
   7) Distribution
   8) Game
   9) Graphics
  10) Language
  11) Math
  12) Network
  13) Sound
  14) System
  15) Testing
  16) Text
  17) Web
  18) Other (specify)
Your choice? ProblemSolver
ProblemSolver is not a valid choice.
Your choice? 18
Please specify? ProblemSolver
What does the package build:
   1) Library
   2) Executable
Your choice? 2
Generating LICENSE...
Generating Setup.hs...
Generating y.cabal...

You may want to edit the .cabal file and add a Description field.
Run Code Online (Sandbox Code Playgroud)

"好极了,"你想,"我太过于沮丧,我敢打赌所有最新的Haskell软件开发最佳实践都在我的磁盘上等待."

$ ls
LICENSE  problemsolver.cabal  Setup.hs
Run Code Online (Sandbox Code Playgroud)

请允许我总结一下我的感受: :(

生成的阴谋文件甚至没有一个Main规定,更说明了建立一个基本的项目.还是,好的.如果你稍微试图找到正确的搜索关键字,你将落在如何写一个Haskell程序,这是好的,除了:

  • 所有Haq源代码都被抛入根目录.
  • Haq的测试代码仅在Test.hs,仅为QuickCheck,并且无法通过拆分文件测试继续项目.
  • 所有这些都必须为每个新项目手动编写或复制.

检查真实世界Haskell的第11章,你会发现它甚至没有提到 cabal和裙子完全是项目布局的问题.Don Stewart 在这里提到的任何资源都没有在上述任何一个中得到解决,我将注意到,Stewart先生没有解释如何使用任何引用的工具.

请注意,Haskell测试工作流程中接受的答案引用了一个项目,该项目已经充分展开,因此不是一个好的答案,但确实

由于阴谋测试尚不存在 - 我们有一名学生正在为今年夏天的代码工作! - 我们拥有的最佳机制是使用cabal的用户钩子机制.

嘿,好吧,cabal文档!该相应部分确实有例子,但他们非常做作,但不失败,给人的印象,每个人都对自己的好运给你.

当然,总是测试框架似乎很好但是它的示例代码没有提供超出wiki中所见的任何东西,并且在我的程序复杂性增长的情况下我是不可扩展的挂钩开发将测试划分为可管理模块的方法.我甚至不确定HTF会发生什么,并同意沃尔科夫先生的评估.

Jelvis先生对链接的HTF问题的评论对我特别感兴趣:Haskell工具链非常糟糕地受到小决策的暴政.我不能真正踏踏实实地在手头的任务-解决我在Haskell的问题-因为我上了钩的让我的环境,只是右.为什么这很糟糕:

  • 这是浪费精力.除非我正在编写一个测试工具,否则我将非常非常关心我的测试是如何被填充的,只是从哪里开始.
  • 这很难学.似乎没有单一的资源来建立一个带有测试的项目,而且确实存在的各种来源是多种多样的,以至于无益.
  • 重现很难.有这么多动人的作品要安排我每次都必须做不同的事情.
  • 作为必然结果,它是特殊的.这意味着很难合作并获得休眠项目.

这只是简单的臭味.

也许我错了.是否存在一些宣传不佳的工具或密切开发的工具,以便在Haskell空间中执行与Bundler + Rspec类似的操作?如果没有,那么现在的Haskell测试中是否有一个广告宣传的典型例子,斯图尔特先生的所有引用好的东西都在其中?该项目创建或演示:

  • 按惯例和工具应该以明确定义的方式将测试代码与应用程序代码分开(在Ruby-land中,Rspec测试进入spec/,Cucumber功能在,features/),
  • 不应要求最终用户编译和安装测试依赖项
  • 应该易于重复,最好不超过10分钟
  • 应该标准化或有标准化的希望.

我错误地相信Haskell-land中没有这样的东西吗?


编辑0:请注意,Ruby语言社区不是唯一适用的比较.Paul R.在确定配置的强大电流方面是正确的.其他语言以其他方式解决了实现可扩展项目结构的问题:

  • C ::这种语言很古老,而且记录完备,以至于您无法确定采用哪种记录良好的方法.没有这样的工具.
  • Java ::基于约定的配置:您在编译器级别绑定它.许多工具和很好的记录.
  • Scala ::强大的工具支持.
  • Erlang ::如果您知道自己在寻找什么,那就太过精心记录.如果您正在使用钢筋或以其他方式定位OTP,可以说是超出惯例的配置.

Paul R.使用自定义模板的解决方案很有用,如果像C一样,有足够的文档来编译这样的东西.这仍然会遇到我试图在帖子中明确指出的问题,但它是可行的.Haskell的最佳产品 - 我所知道的 - 是"如何编写一个Haskell程序",但不足以相当于用手电筒和一瓶水将一个孤独的童子军扔在树林里.

此外,是的,静态类型很棒并且确实解决了许多本来需要进行显式测试的问题.如果它们是最终解决方案,或者甚至是足够的解决方案,那么快照框架就不会经过如此彻底的测试.(可以说是"复制快照核心."是我的问题的答案.)

scl*_*clv 6

目前没有一种方法可以设置测试套件.希望人们能够实现标准化cabal test,这是开箱即用的.事实上,无论是HUnitQuickCheck还提供与Haskell的平台,因此建立测试不需要下载任何额外的依赖.

你接受的旧答案没有提供相关信息,这是对的cabal test.我编辑了它,现在确实如此!您也可能是正确的,Haskell wiki上的链接页面(也是在cabal test可用之前编写)不提供有关当前测试最佳实践的信息.这是一个维基,我鼓励人们编辑它!但请注意,该页面提供了指向另一个页面的链接,该页面描述了如何构建更复杂的Haskell项目.

tldr; 使用cabal test.我很喜欢test-framework,cabal test如果你愿意,你可以融入其中.对不起,这cabal test是一种新的,并不是我们拥有的所有资源(通常是社区可编辑的)已经更新以指向它并描述如何使用它.更新大量资源和创建教程是社区的工作.在过去的几年中,我们应该更好地推广许多引入Haskell生态系统的新工具.