【问题标题】:Can I put a custom package link to stack.yaml?我可以将自定义包链接放到 stack.yaml 中吗?
【发布时间】:2020-04-21 10:48:20
【问题描述】:

为了打印出漂亮的垂直树,我搜索了谷歌,找到了一个包pretty-tree

我想导入这个包,但是问题是:

Stackage LTS 似乎不包含这个包。

所以当我将pretty-tree 添加到package.yamlstack build 时,它会提示

In the dependencies for quick-sort-0.1.0.0:
    pretty-tree needed, but the stack configuration has no specified version  (latest matching version is 0.1.0.0)
needed since quick-sort is a build target.

Some different approaches to resolving this:

  * Recommended action: try adding the following to your extra-deps in E:\work-category-theory\quick-sort\stack.yaml:

- pretty-tree-0.1.0.0@sha256:49b0e17008f9d30328db2bcc2958f3a7b78d154d2335c2dbaa2073e237b524ae,668

我将此修订添加到stack.yaml

extra-deps:
  - pretty-tree-0.1.0.0@sha256:49b0e17008f9d30328db2bcc2958f3a7b78d154d2335c2dbaa2073e237b524ae,668

这个问题解决了,我可以编译成功了。

问题是:

  1. pretty-tree-0.1.0.0@sha256:49b0e17008f9d30328db2bcc2958f3a7b78d154d2335c2dbaa2073e237b524ae, 688是什么,来自哪里?

    堆栈文档是这样说的

    额外部门

    此字段允许您在快照中定义的内容之上指定额外的依赖项(在上述解析器字段中指定)。这些依赖项可能来自本地文件路径或 Pantry 包位置。

    对于本地文件路径情况,应用与包相同的相对路径规则。

    Pantry 包位置允许您包含来自三种不同来源的依赖项:

    黑客攻击

    存档(tarball 或 zip 文件,本地或通过 HTTP(S))

    Git 或 Mercurial 存储库

    但我不知道 Pantry 是什么...

  2. 还有另一种方法可以解决此问题。 那就是

    1. https://hackage.haskell.org/package/pretty-tree下载pretty-tree-0.1.0.0.tar.gz
    2. 解压到我的项目文件夹中。
    3. pretty-tree-0.1.0.0 添加到stack.yaml
    packages:
    - .
    - pretty-tree-0.1.0.0
    

    上面这个方法也可以解决问题,但是我的问题是:

    我可以将此链接https://hackage.haskell.org/package/pretty-tree-0.1.0.0/pretty-tree-0.1.0.0.tar.gz 直接添加到stack.yaml 吗?如:

    extra-deps: 
      - url: https://hackage.haskell.org/package/pretty-tree-0.1.0.0/pretty-tree-0.1.0.0.tar.gz
    

    我试了一下,stack提示错误:

E:\work-category-theory\quick-sort>stack build
Stack has not been tested with GHC versions above 8.6, and using 8.8.3, this may fail
Stack has not been tested with Cabal versions above 2.4, but version 3.0.1.0 was found, this may fail
boxes               > using precompiled package
contravariant       > using precompiled package
distributive        > using precompiled package
th-abstraction      > using precompiled package
transformers-compat > using precompiled package
unordered-containers> using precompiled package
pretty-tree         > configure
pretty-tree         > Configuring pretty-tree-0.1.0.0...
pretty-tree         > build
pretty-tree         > Preprocessing library for pretty-tree-0.1.0.0..
pretty-tree         > Building library for pretty-tree-0.1.0.0..
pretty-tree         > [1 of 1] Compiling Data.Tree.Pretty
pretty-tree         > copy/register
pretty-tree         > Installing library in C:\sr\snapshots\34184208\lib\x86_64-windows-ghc-8.8.3\pretty-tree-0.1.0.0-KT
aQApPwVahHd2AQwQQQSA
pretty-tree         > Registering library for pretty-tree-0.1.0.0..
Received ExitFailure 1 when running
Raw command: "C:\\Users\\Chansey\\AppData\\Local\\Programs\\stack\\x86_64-windows\\ghc-8.8.3\\bin\\ghc-pkg.exe" --user -
-no-user-package-db --package-db "C:\\sr\\snapshots\\34184208\\pkgdb" describe --simple-output distributive --expand-pkg
root
Standard error:

ghc-pkg.exe: C:\sr\snapshots\34184208\pkgdb\th-abstraction-0.3.2.0-D5zRQZUNFcq6kU1WHIrSvs.conf: getModificationTime:Crea
teFile "\\\\?\\C:\\sr\\snapshots\\34184208\\pkgdb\\th-abstraction-0.3.2.0-D5zRQZUNFcq6kU1WHIrSvs.conf": does not exist (
The system cannot find the file specified.)

Progress 7/15

对不起,由于我对 Haskell 生态系统不是很熟悉,这个问题可能很愚蠢。

谢谢。


编辑:

我发现如果我第一次使用

extra-deps:
  - pretty-tree-0.1.0.0@sha256:49b0e17008f9d30328db2bcc2958f3a7b78d154d2335c2dbaa2073e237b524ae,668

然后回滚到

  extra-deps: 
    - url: https://hackage.haskell.org/package/pretty-tree-0.1.0.0/pretty-tree-0.1.0.0.tar.gz

错误消失了,但我不知道为什么...

【问题讨论】:

  • 您为什么要这样做?添加pretty-tree-0.1.0.0 是执行此操作的完美方式。
  • @Erich 因为对 Haskell 生态不熟悉,所以想了解一下最佳实践。
  • 好的,那我告诉你,添加pretty-tree-0.1.0.0是最好的做法。
  • 是的,恕我直言,这是最好的方法。
  • @chansey 它是 Stack 的内部组件,用于指定包版本。有关详细信息,请参阅the documentation

标签: haskell haskell-stack hackage stackage


【解决方案1】:
  1. pretty-tree-0.1.0.0@sha256:49b0e17008f9d30328db2bcc2958f3a7b78d154d2335c2dbaa2073e237b524ae, 688 是什么,来自哪里?

您包含的这一长串文本是对软件包版本的描述。 pretty-tree 是包名,0.1.0.0 是你正在使用的版本,49b0e17008f9d30328db2bcc2958f3a7b78d154d2335c2dbaa2073e237b524ae 是包的 Cabal 文件的 SHA256 哈希,688 是 Cabal 文件的大小。 (来源:https://docs.haskellstack.org/en/stable/pantry/)真的只需要包含pretty-tree-0.1.0.0 位;其余的不是必需的,但如果你确实包含它,Stack 会使用它来进行验证,通过检查它是否每次都下载相同的包来确保你的构建是可重现的。

但我不知道 Pantry 是什么...

Pantry 只是 Stack 用来指定 Stack 版本的内部组件。您无需了解 Pantry 是什么或它是如何工作的即可使用 Stack,但如果您有兴趣,可以参考 https://docs.haskellstack.org/en/stable/pantry/ 了解更多信息。

还有另一种方法可以解决这个问题……下载pretty-tree-0.1.0.0.tar.gz

我不知道您为什么要这样做:这几乎正是 Stack 安装软件包时所做的,但如果您手动安装,则更有可能搞砸。

我可以将这个链接https://hackage.haskell.org/package/pretty-tree-0.1.0.0/pretty-tree-0.1.0.0.tar.gz直接添加到stack.yaml吗?

再说一次,我不完全说明你为什么要这样做,因为当你指定 pretty-tree-0.1.0.0 时,Stack 会从这个位置下载包。但令人惊讶的是,事实证明,如果你真的愿意,你实际上可以做到这一点!使用documentation for extra-deps,您似乎可以执行以下操作:

extra-deps:
- url: https://hackage.haskell.org/package/pretty-tree-0.1.0.0/pretty-tree-0.1.0.0.tar.gz

(未经测试,但这应该可以。如果不行,您可能需要根据链接文档添加subdirs: 部分。)

【讨论】:

  • "我不知道你为什么要这样做:这几乎正是 Stack 安装软件包时所做的,但如果你手动安装,你有更大的机会搞砸它。”我认为这种方法的好处是我们可以修改pretty-tree的源代码。当然,这是另一回事了。
  • @chansey 有趣的一点!我没想到。但是如果你想修改源代码,有一个更简单的方法:git clone(或其他类似的方法)将pretty-tree的代码放到另一个目录,在那里修改代码,并添加一个extra-dep指向那个目录。简单得多,而且不需要你弄乱 Stack 的内部结构。
  • documentation for extra-deps 之后,我测试了在stack.yaml 中将url: https://hackage.haskell.org/package/pretty-tree-0.1.0.0/pretty-tree-0.1.0.0.tar.gz 添加到extra-deps:,但正如我在问题中提到的那样失败了。反正现在已经不是问题了。
  • @chansey 我刚刚查看了那个错误,它看起来很不寻常。我建议在 issues page 上将其作为 Stack 的问题提交。
  • 我没有添加指向该目录的extra-dep:。我将“pretty-tree-0.1.0.0”添加到stack.yaml 中的packages:。 (“pretty-tree-0.1.0.0”是pretty-tree-0.1.0.0.tar.gz的解压文件夹)。我没有测试您的方法,即“添加指向该目录的额外dep”。
猜你喜欢
  • 2012-03-20
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多