找不到模块‘ criterion.main’试图基准Haskell时

发布于 2025-01-22 17:22:47 字数 7893 浏览 5 评论 0 原文

我无法获得工作标准。我遵循教程在这里,通过执行以下操作来安装标准。

cabal update
cabal install -j --disable-tests criterion

当我尝试 ghc -o fibber.hs ghc -o-make fibber 时,我会收到

[1 of 1] Compiling Main             ( Fibber.hs, Fibber.o )

Fibber.hs:1:1: error:
    Could not find module ‘Criterion.Main’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
1 | import Criterion.Main
  |

我希望测试和诊断的 错误HTML文件。 尝试堆栈会导致相同的错误。我以前用自己的模块将它们包含在我的 .cabal 文件中,

library
  Exposed-Modules:
    Geometry.Sphere
    Geometry.Cuboid
    Geometry.Cube

但在这种情况下这样做并不能解决问题,我已经解决了这个问题。我还尝试了 so so so Solution ,但无用。我基本上会收到相同的错误:


/Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs:3:1: error:
    Could not find module ‘CriterionMain’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
3 | import CriterionMain
  | ^^^^^^^^^^^^^^^^^^^^
Received ExitFailure 1 when running
Raw command: /Users/me/.stack/programs/aarch64-osx/ghc-9.2.2/bin/ghc-9.2.2 -i -i/Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/ -hide-all-packages -fdiagnostics-color=always -packagebase -O2 /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs
Run from: /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/
Standard output:

[1 of 1] Compiling Main             ( /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs, /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.o )

这是我的 .cabal 文件。

name:           criterion
version:        1.5.13.0
synopsis:       Robust, reliable performance measurement and analysis
license:        BSD3
license-file:   LICENSE
author:         Bryan O'Sullivan <[email protected]>
maintainer:     Ryan Scott <[email protected]>
copyright:      2009-2016 Bryan O'Sullivan and others
category:       Development, Performance, Testing, Benchmarking
homepage:       http://www.serpentine.com/criterion
bug-reports:    https://github.com/haskell/criterion/issues
build-type:     Simple
cabal-version:  >= 1.10
extra-source-files:
  README.markdown
  changelog.md
  examples/LICENSE
  examples/*.cabal
  examples/*.hs
tested-with:
  GHC==7.4.2,
  GHC==7.6.3,
  GHC==7.8.4,
  GHC==7.10.3,
  GHC==8.0.2,
  GHC==8.2.2,
  GHC==8.4.4,
  GHC==8.6.5,
  GHC==8.8.4,
  GHC==8.10.7,
  GHC==9.0.2,
  GHC==9.2.1

data-files:
  templates/*.css
  templates/*.tpl
  templates/*.js

description:
  This library provides a powerful but simple way to measure software
  performance.  It provides both a framework for executing and
  analysing benchmarks and a set of driver functions that makes it
  easy to build and run benchmarks, and to analyse their results.
  .
  The fastest way to get started is to read the
  <http://www.serpentine.com/criterion/tutorial.html online tutorial>,
  followed by the documentation and examples in the "Criterion.Main"
  module.
  .
  For examples of the kinds of reports that criterion generates, see
  <http://www.serpentine.com/criterion the home page>.

flag fast
  description: compile without optimizations
  default: False
  manual: True

flag embed-data-files
  description: Embed the data files in the binary for a relocatable executable.
               (Warning: This will increase the executable size significantly.)
  default: False
  manual: True

library
  exposed-modules:
    Criterion
    Criterion.Analysis
    Criterion.IO
    Criterion.IO.Printf
    Criterion.Internal
    Criterion.Main
    Criterion.Main.Options
    Criterion.Monad
    Criterion.Report
    Criterion.Types

  other-modules:
    Criterion.Main.Options.Internal
    Criterion.Monad.Internal

  other-modules:
    Paths_criterion

  build-depends:
    -- TODO: Eventually, we should bump the lower version bounds to >=2 so that
    -- we can remove some CPP in Criterion.Report. See #247.
    aeson >= 1 && < 2.1,
    ansi-wl-pprint >= 0.6.7.2,
    base >= 4.5 && < 5,
    base-compat-batteries >= 0.10 && < 0.13,
    binary >= 0.5.1.0,
    binary-orphans >= 1.0.1 && < 1.1,
    bytestring >= 0.9 && < 1.0,
    cassava >= 0.3.0.0,
    code-page,
    containers,
    criterion-measurement >= 0.1.1.0 && < 0.2,
    deepseq >= 1.1.0.0,
    directory,
    exceptions >= 0.8.2 && < 0.11,
    filepath,
    Glob >= 0.7.2,
    microstache >= 1.0.1 && < 1.1,
    js-chart >= 2.9.4 && < 3,
    mtl >= 2,
    mwc-random >= 0.8.0.3,
    -- TODO: Depend on optparse-applicative-0.17 as the minimum (see #258)
    optparse-applicative >= 0.13 && < 0.18,
    parsec >= 3.1.0,
    statistics >= 0.14 && < 0.16,
    text >= 0.11,
    time,
    transformers,
    transformers-compat >= 0.6.4,
    vector >= 0.7.1,
    vector-algorithms >= 0.4
  if impl(ghc < 7.6)
    build-depends:
      ghc-prim
  if !impl(ghc >= 8.0)
    build-depends:
      fail == 4.9.*,
      semigroups

  default-language: Haskell2010
  ghc-options: -Wall -funbox-strict-fields
  if impl(ghc >= 6.8)
    ghc-options: -fwarn-tabs
  if flag(fast)
    ghc-options: -O0
  else
    ghc-options: -O2

  if flag(embed-data-files)
    other-modules: Criterion.EmbeddedData
    build-depends: file-embed < 0.1,
                   template-haskell
    cpp-options: "-DEMBED"

Executable criterion-report
  Default-Language:     Haskell2010
  GHC-Options:          -Wall -rtsopts
  Main-Is:              Report.hs
  Other-Modules:        Options
                        Paths_criterion
  Hs-Source-Dirs:       app

  Build-Depends:
    base,
    base-compat-batteries,
    criterion,
    optparse-applicative >= 0.13

  if impl(ghc < 7.6)
    build-depends:
      ghc-prim

  if !impl(ghc >= 8.0)
    build-depends:
      semigroups

test-suite sanity
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       tests
  main-is:              Sanity.hs
  default-language:     Haskell2010
  ghc-options:          -Wall -rtsopts
  if flag(fast)
    ghc-options:        -O0
  else
    ghc-options:        -O2

  build-depends:
    HUnit,
    base,
    bytestring,
    criterion,
    deepseq,
    tasty,
    tasty-hunit

test-suite tests
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       tests
  main-is:              Tests.hs
  default-language:     Haskell2010
  other-modules:        Properties

  ghc-options:
    -Wall -threaded     -O0 -rtsopts

  build-depends:
    QuickCheck >= 2.4,
    base,
    base-compat-batteries,
    criterion,
    statistics,
    HUnit,
    tasty,
    tasty-hunit,
    tasty-quickcheck,
    vector,
    aeson

test-suite cleanup
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       tests
  default-language:     Haskell2010
  main-is:              Cleanup.hs

  ghc-options:
    -Wall -threaded     -O0 -rtsopts

  build-depends:
    HUnit,
    base,
    base-compat,
    bytestring,
    criterion,
    deepseq,
    directory,
    tasty,
    tasty-hunit

source-repository head
  type:     git
  location: https://github.com/haskell/criterion.git

I cannot get Criterion to work. I followed the tutorial here, installing Criterion by doing the following.

cabal update
cabal install -j --disable-tests criterion

when I try ghc -O Fibber.hs or ghc -O --make Fibber I receive the error

[1 of 1] Compiling Main             ( Fibber.hs, Fibber.o )

Fibber.hs:1:1: error:
    Could not find module ‘Criterion.Main’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
1 | import Criterion.Main
  |

I expect tests and diagnostics to be run and outputted to the console and an HTML file.
trying with stack results in the same error. I have solved this problem before with my own modules by including them in my .cabal file like so

library
  Exposed-Modules:
    Geometry.Sphere
    Geometry.Cuboid
    Geometry.Cube

But doing this same in this case does not resolve the issue. I have also tried this SO solution, but to no avail. I receive basically the same error:


/Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs:3:1: error:
    Could not find module ‘CriterionMain’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
3 | import CriterionMain
  | ^^^^^^^^^^^^^^^^^^^^
Received ExitFailure 1 when running
Raw command: /Users/me/.stack/programs/aarch64-osx/ghc-9.2.2/bin/ghc-9.2.2 -i -i/Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/ -hide-all-packages -fdiagnostics-color=always -packagebase -O2 /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs
Run from: /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/
Standard output:

[1 of 1] Compiling Main             ( /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs, /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.o )

this is my .cabal file.

name:           criterion
version:        1.5.13.0
synopsis:       Robust, reliable performance measurement and analysis
license:        BSD3
license-file:   LICENSE
author:         Bryan O'Sullivan <[email protected]>
maintainer:     Ryan Scott <[email protected]>
copyright:      2009-2016 Bryan O'Sullivan and others
category:       Development, Performance, Testing, Benchmarking
homepage:       http://www.serpentine.com/criterion
bug-reports:    https://github.com/haskell/criterion/issues
build-type:     Simple
cabal-version:  >= 1.10
extra-source-files:
  README.markdown
  changelog.md
  examples/LICENSE
  examples/*.cabal
  examples/*.hs
tested-with:
  GHC==7.4.2,
  GHC==7.6.3,
  GHC==7.8.4,
  GHC==7.10.3,
  GHC==8.0.2,
  GHC==8.2.2,
  GHC==8.4.4,
  GHC==8.6.5,
  GHC==8.8.4,
  GHC==8.10.7,
  GHC==9.0.2,
  GHC==9.2.1

data-files:
  templates/*.css
  templates/*.tpl
  templates/*.js

description:
  This library provides a powerful but simple way to measure software
  performance.  It provides both a framework for executing and
  analysing benchmarks and a set of driver functions that makes it
  easy to build and run benchmarks, and to analyse their results.
  .
  The fastest way to get started is to read the
  <http://www.serpentine.com/criterion/tutorial.html online tutorial>,
  followed by the documentation and examples in the "Criterion.Main"
  module.
  .
  For examples of the kinds of reports that criterion generates, see
  <http://www.serpentine.com/criterion the home page>.

flag fast
  description: compile without optimizations
  default: False
  manual: True

flag embed-data-files
  description: Embed the data files in the binary for a relocatable executable.
               (Warning: This will increase the executable size significantly.)
  default: False
  manual: True

library
  exposed-modules:
    Criterion
    Criterion.Analysis
    Criterion.IO
    Criterion.IO.Printf
    Criterion.Internal
    Criterion.Main
    Criterion.Main.Options
    Criterion.Monad
    Criterion.Report
    Criterion.Types

  other-modules:
    Criterion.Main.Options.Internal
    Criterion.Monad.Internal

  other-modules:
    Paths_criterion

  build-depends:
    -- TODO: Eventually, we should bump the lower version bounds to >=2 so that
    -- we can remove some CPP in Criterion.Report. See #247.
    aeson >= 1 && < 2.1,
    ansi-wl-pprint >= 0.6.7.2,
    base >= 4.5 && < 5,
    base-compat-batteries >= 0.10 && < 0.13,
    binary >= 0.5.1.0,
    binary-orphans >= 1.0.1 && < 1.1,
    bytestring >= 0.9 && < 1.0,
    cassava >= 0.3.0.0,
    code-page,
    containers,
    criterion-measurement >= 0.1.1.0 && < 0.2,
    deepseq >= 1.1.0.0,
    directory,
    exceptions >= 0.8.2 && < 0.11,
    filepath,
    Glob >= 0.7.2,
    microstache >= 1.0.1 && < 1.1,
    js-chart >= 2.9.4 && < 3,
    mtl >= 2,
    mwc-random >= 0.8.0.3,
    -- TODO: Depend on optparse-applicative-0.17 as the minimum (see #258)
    optparse-applicative >= 0.13 && < 0.18,
    parsec >= 3.1.0,
    statistics >= 0.14 && < 0.16,
    text >= 0.11,
    time,
    transformers,
    transformers-compat >= 0.6.4,
    vector >= 0.7.1,
    vector-algorithms >= 0.4
  if impl(ghc < 7.6)
    build-depends:
      ghc-prim
  if !impl(ghc >= 8.0)
    build-depends:
      fail == 4.9.*,
      semigroups

  default-language: Haskell2010
  ghc-options: -Wall -funbox-strict-fields
  if impl(ghc >= 6.8)
    ghc-options: -fwarn-tabs
  if flag(fast)
    ghc-options: -O0
  else
    ghc-options: -O2

  if flag(embed-data-files)
    other-modules: Criterion.EmbeddedData
    build-depends: file-embed < 0.1,
                   template-haskell
    cpp-options: "-DEMBED"

Executable criterion-report
  Default-Language:     Haskell2010
  GHC-Options:          -Wall -rtsopts
  Main-Is:              Report.hs
  Other-Modules:        Options
                        Paths_criterion
  Hs-Source-Dirs:       app

  Build-Depends:
    base,
    base-compat-batteries,
    criterion,
    optparse-applicative >= 0.13

  if impl(ghc < 7.6)
    build-depends:
      ghc-prim

  if !impl(ghc >= 8.0)
    build-depends:
      semigroups

test-suite sanity
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       tests
  main-is:              Sanity.hs
  default-language:     Haskell2010
  ghc-options:          -Wall -rtsopts
  if flag(fast)
    ghc-options:        -O0
  else
    ghc-options:        -O2

  build-depends:
    HUnit,
    base,
    bytestring,
    criterion,
    deepseq,
    tasty,
    tasty-hunit

test-suite tests
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       tests
  main-is:              Tests.hs
  default-language:     Haskell2010
  other-modules:        Properties

  ghc-options:
    -Wall -threaded     -O0 -rtsopts

  build-depends:
    QuickCheck >= 2.4,
    base,
    base-compat-batteries,
    criterion,
    statistics,
    HUnit,
    tasty,
    tasty-hunit,
    tasty-quickcheck,
    vector,
    aeson

test-suite cleanup
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       tests
  default-language:     Haskell2010
  main-is:              Cleanup.hs

  ghc-options:
    -Wall -threaded     -O0 -rtsopts

  build-depends:
    HUnit,
    base,
    base-compat,
    bytestring,
    criterion,
    deepseq,
    directory,
    tasty,
    tasty-hunit

source-repository head
  type:     git
  location: https://github.com/haskell/criterion.git

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

紫﹏色ふ单纯 2025-01-29 17:22:47

一种选项是使用依赖关系解决的重置。

% cabal repl --build-depends criterion
> :l Fibber.hs

另一个是创建一个集团包。

% mkdir Fibber
% mv Fibber.hs Fibber
% cd Fibber
% cabal init
<follow prompts, and say you're building an executable with filename Fibber.hs>
% vi Fibber.cabal
<add criterion to the build-depends: stanza>
% cabal run Fibber # or whatever executable name you gave it in the cabal init step

后者的一个优点是,当您发现其他依赖项时,您可以在文件中记录所有依赖项,而不必记住每次启动 cabal repl 时每次传递全部。 。另一个是您的代码将被编译而不是解释;对于性能测试而言相当重要,这大概是您需要标准的工作!

One option is to use a dependency-solved REPL.

% cabal repl --build-depends criterion
> :l Fibber.hs

Another is to create a cabal package.

% mkdir Fibber
% mv Fibber.hs Fibber
% cd Fibber
% cabal init
<follow prompts, and say you're building an executable with filename Fibber.hs>
% vi Fibber.cabal
<add criterion to the build-depends: stanza>
% cabal run Fibber # or whatever executable name you gave it in the cabal init step

One advantage of the latter is that as you discover additional dependencies, you can make a record of all of them in a file, instead of having to remember to pass all of them every time when you start cabal repl. Another is that your code will be compiled, rather than interpreted; rather important for performance testing, which is presumably what you're doing if you need criterion!

跨年 2025-01-29 17:22:47

5分钟Cabal的解释

只是简短而不是完整的解释 Cabal 有效的工作,因此您可以理解错误。

一个项目由组件组成:库和“可运行”(为了解释而组成的名称)。每个组件在 build依赖标签下都有其自己的依赖关系集。

库没有切入点,因此它们不需要 MAIN 功能,也不需要指定 MAIN-IS 。 Cabal文件仅具有 a>是软件包的名称,位于标记为 name 的文件顶部。您可以拥有内部库,但这就是另一个主题。在 Criterion 的Cabal文件中,您会看到:

  • name Criterion (第一行)
  • library 标签。 (依赖关系,裸露的模块等)

确实需要一个 main 功能,并且标记为 main-IS 的模块。可运行的人可以是可执行的,测试套件或基准测试。 afaik将可运行的标签标记为其中之一,仅影响 cabal 编译/install 通过命令: cabal build cabal run cabal Test cabal bench 等...例如, cabal build 将编译(默认情况下)库组件和可执行组件,可执行的组件生成一个每个可执行文件,但是<<代码> Cabal Test 将编译库组件和测试组件,然后运行测试。从理论上讲,您可以使用 criterion.main.defaultmain 作为普通可执行文件的主要函数(在Cabal文件中定义为可执行组件),在这种情况下,Cabal将生成一个独立的EXE,该EXE将运行该运行执行基准。

Criterion 的Cabal文件中,您可以在Exectuable和三个测试套件上看到:

  • 可执行文件命名 Criterion-Report-Reterport App app 文件夹
  • 测试套件 SANITY test 清理 test> test 带有不同主文件的文件夹每个

组件的每个组件都有不同的依赖关系集,尤其是,所有这些都取决于 Criterion ,它是在 library 下的同一Cabal文件中定义的组件,如上所述。

那么我的错误是什么?

因此,从本质上讲,您希望 fibber.hs 文件是“可运行的”文件,可以作为独立二进制文件或项目中的基准套件。因此,您需要根据需要将其添加到Cabal文件中。作为建议,请避免将其添加到Criterion的Cabal文件中,否则您将从源中编译标准。关注@DanielWagner回答,并创建一个新项目,其中 fibber.hs 是一个主文件,并将 criterion 添加到其依赖项中,或使用依赖项 - 重新替代方案。

5 minutes Cabal explanation

Just a brief and not complete explanation about how cabal works so you can understand the error.

A project is made up of components: libraries and "runnables" (made up name for the sake of explanation). Each component has its own set of dependencies under build-depends tag.

Libraries do not have an entry point, so they don't need a main function and do not need to specify main-is. A cabal file has only one public library which is the name of the package, at the top of the file tagged as name. You can have internal libraries, but thats another topic. In the criterion's cabal file you see:

  • The name is criterion (first line)
  • The library build configuration under library tag. (dependencies, exposed modules, etc...)

Runnables do need a main function and a module marked as the main-is. Runnables can be a executables, test suites or benchmarks. AFAIK, labeling a runnable as one of them, only affects the way cabal compiles/install them via commands: cabal build, cabal run, cabal test, cabal bench, etc... For example cabal build will compile (by default) the library component and the executable components generating binary files one per executable, but cabal test will compile the library component and the test components, and then run the tests. In theory you can use Criterion.Main.defaultMain as the main function for a normal executable (define as en executable component in cabal file), in this case, cabal will generate an standalone exe which will run the benchmark on execution.

In the criterion's cabal file you see on exectuable and three test suites:

  • Executable named criterion-report under app folder
  • Test suites sanity, test and cleanup under test folder with different main files each

Each of this components has different dependencies sets, and in particular, all of them depend on the criterion library which is the component defined in the same cabal file under section library, as explained above.

So what's goint on with my error?

So essentialy, you want the Fibber.hs file to be a "runnable" file, either as a standalone binary or as a benchmark suite in a project. Therefore, you need to add it to a cabal file as you prefer. As a suggestion, avoid adding it to criterion's cabal file otherwise you'll be compiling criterion from source. Follow @DanielWagner answer and create a new project in which Fibber.hs is a main file and add criterion to its dependencies, or use the dependency-repl alternative.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文