使用 引用特定版本的git存储库的正确方法是Stack什么?
堆栈抱怨在第一场出现的语法错误extra-deps的部分stack.yaml。下面的代码片段基于官方 Stack 文档中的一个示例,我不太确定为什么它不起作用。
# Dependency packages to be pulled from upstream that are not in the resolver
# (e.g., acme-missiles-0.3)
extra-deps:
- git: https://github.com/jwaldmann/moo
commit: b429a7d371c0b268a4bb8dbea8044054aaf04cd5
- git: https://github.com/jwaldmann/monad-mersenne-random
commit: d1f949fe60dc0c0cfbd310b339fe7fd5ecf4c5f5
- gray-code-0.3.1
#extra-deps: [gray-code-0.3.1]
Run Code Online (Sandbox Code Playgroud) 我正在克隆以下存储库并stack.yaml通过在末尾添加对进行一项更改:
docker:
enable: true
Run Code Online (Sandbox Code Playgroud)
运行haskoin-core我正在使用的所有测试
stack test haskoin-core:test-haskoin-core
Run Code Online (Sandbox Code Playgroud)
我想做的只是运行一个测试。如果是这样的HSpec(这是不是)我会运行类似:
stack test --test-arguments -m "Network.Haskoin.Network.Units"
Run Code Online (Sandbox Code Playgroud)
现在我可以做的是修改文件haskcoin-core/test/Main.hs并注释掉所有我不想运行的测试。但是你知道 - 应该有一种更简单的方法来运行它,只使用命令行参数。(改变文件系统会影响 Haskell 的整个功能)。
我也愿意以stack ghci某种方式运行它。
我的问题是:如何使用 Stack 和 Haskell Test.Framework 运行单个测试?
说,我需要System.Eval.Haskell。或者别的什么。我怎么知道我应该在我的文件中指定哪个包package.yaml?当我转到https://hackage.haskell.org/package/plugins-1.5.7/docs/System-Eval-Haskell.html 时,我看不到包名称。
PS“插件”对我不起作用。因此,我认为这是不同的东西。但愿如此 :)
看起来配置中的额外依赖项和“常规”依赖项之间存在一些不太清楚的区别。提到plugins-1.5.7extra-dep 确实有效。我是否在这里做一些依赖管理不善,或者这是绿色的方式?
是否可以stack ghci像ghci通过~/.ghci文件配置的方式进行配置?
当前stack ghci不选取~/.ghci文件中的设置。
我正在考虑将提示设置为 lambda 而不是加载的模块:
:set prompt "\ESC[33m\STX?> \ESC[m\STX"
Run Code Online (Sandbox Code Playgroud)
更新
[neo@nixos:~/HaskellLearning/IdeTest]$ stack ghci 以下 GHC 选项与 GHCi 不兼容,尚未传递给它: -threaded 使用以下包配置 GHCi: IdeTest 使用主模块: 1. 包 `IdeTest'组件 exe:IdeTest-exe 与 main-is 文件:/home/neo/HaskellLearning/IdeTest/app/Main.hs GHCi,版本 8.2.2:http : //www.haskell.org/ghc/ :? 寻求帮助 从 /home/neo/HaskellLearning/IdeTest/.ghci 加载 GHCi 配置 从 /home/neo/.ghci 加载 GHCi 配置 [1 of 9] 编译 Ch13
( /home/neo/HaskellLearning/IdeTest/src/Ch13.hs, 解释 ) [2 of 9] 编译 Ch15 ( /home/neo/HaskellLearning/IdeTest/src/Ch15.hs, 解释 ) [3 of 9] …
我只是注意到通过运行的 Haskell 程序stack不会从调用环境接收环境变量。这是一个示例程序:
-- testenv.hs
import System.Environment
main :: IO ()
main = print =<< getEnv "FOOBAR"
Run Code Online (Sandbox Code Playgroud)
如果我在没有堆栈的情况下运行它,就像这样,它可以工作:
% FOOBAR=123 runhaskell testenv.hs
"123"
Run Code Online (Sandbox Code Playgroud)
但是使用堆栈:
% FOOBAR=123 stack runhaskell testenv.hs
testenv.hs: FOOBAR: getEnv: does not exist (no environment variable)
Run Code Online (Sandbox Code Playgroud)
编译时也是如此:工作时FOOBAR=123 stack exec testenv失败FOOBAR=123 .stack-work/install/BLAHBLAH/testenv。
有没有办法强制堆栈传递某些环境变量?
我遇到的真正问题是yesod devel,我想用环境变量覆盖一些设置,但yesod devel使用堆栈来运行程序,因此它们不会通过。
这是 NixOS 18.03.132262.0a73111bc29 上的堆栈 1.6.5。
我正在尝试在项目中使用以下命令构建本地 hoogle 服务器,该项目lts-11.1用作解析器stack.yaml
stack hoogle -- server --local --port=8080
Run Code Online (Sandbox Code Playgroud)
它曾经可以工作,但现在由于此错误而失败:
? stack hoogle -- server --local --port=8080
Hoogle isn't installed. Automatically installing (use --no-setup to disable) ...
Minimum version is hoogle-5.0. Found acceptable hoogle-5.0.17.6 in your index, installing it.
Error: While constructing the build plan, the following exceptions were encountered:
In the dependencies for hoogle-5.0.17.6:
haskell-src-exts-1.20.3 from stack configuration does not match >=1.21 && <1.22 (latest matching version is 1.21.0)
needed since hoogle is a build target. …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用stack设置happstack-lite应用程序。
我用这些命令初始化了项目:
stack new my-happstack
cd my-happstack
stack setup
Run Code Online (Sandbox Code Playgroud)
我更改了package.yaml,因此它包含:
dependencies:
- base >= 4.7 && < 5
- happstack-lite >= 7.3
Run Code Online (Sandbox Code Playgroud)
然后我多次运行stack build并根据建议更改了项目目录中stack.yaml中的extra-deps(添加了依赖项,例如happstack-server)。
显然,我被要求将已经列出的包添加到extra-deps中,它们具有不同的版本边界和相同的版本(template-haskell-2.11.1.0):
stack.yaml内容:
extra-deps:
- happstack-lite-7.3.6
- happstack-server-7.4.6.4
- Win32-2.2.2.0@sha256:10ed55dd31315f386910c121c1d1d442df83bd2ee92090a753cd65300735a8ca
- network-2.6.3.6@sha256:1ca79d81af02d7acd6032d5e6c9bde4618a8fdcfbe19bd42b49d420183975df0
- template-haskell-2.11.1.0@sha256:f90d6ab73ad35c749e8547ca132e7ab5d32d2f8e7bb2e2ff6d597be26b58e061
- transformers-compat-0.5.1.4@sha256:1b4bfa8589afb1ca0e719129ab261bd90ef0cc3e6c0b9963f94970c082b61250
Run Code Online (Sandbox Code Playgroud)
堆栈构建的输出:
F:\Projects\Haskell\my-happstack>stack build
Error: While constructing the build plan, the following exceptions were encountered:
In the dependencies for Cabal-2.4.1.0: …Run Code Online (Sandbox Code Playgroud) 该哈斯克尔工具集是目前最流行的Haskell包管理器,现在,它的主要目标是使大厦哈斯凯尔包重复性。
但是堆栈方法的目标是找到一个巨大的无冲突包修订集,并将其称为snapshot. 通过这种方式,包维护者被推送更新他的包的依赖项,这样它就不会与最近的snapshot.
我不得不说,这个设计太理想了,无法在现实世界中工作。
相比之下,NPM(NodeJS 的包管理器)通过一种更实用的方式来实现这个目标:它允许冗余。在钻石依赖的情况下,例如a -> b, c; b -> d(v1); c -> d(v2),NPM 只需d为b和分别安装两个不同的版本c。这样,使用包的用户就可以像黑盒一样依赖包,无需考虑依赖之间是否存在冲突的深度依赖。
我想知道为什么 Stack 的设计不允许对包进行冗余修订是否有一些实际的原因。是否可以为 Haskell 实现这样的包管理器?它的实施中最困难的部分是什么?
我尝试在 docker-compose 服务中为我的 haskell RPC 服务器代码进行自动重建和 rexecute 设置。该命令是一个 bash 脚本stack build --file-watch(以及另一个在二进制文件更改时启动二进制文件的命令,但这有效)。问题是,无论我尝试什么,stack build --file-watch命令都会失败并出现一个神秘的错误<stdin>: hGetLine: end of file。
我不明白为什么会出现此错误,尤其是因为如果我使用 运行相同的命令docker-compose run bd-service bash -l -c "./bd-service/compile_hs_and_run.sh",它会按预期工作。我相信这是执行 docker-compose up 时如何处理 bash 的问题,而不是堆栈本身的问题,但我承认我一无所知。
另请注意:
这是服务定义:
# this is my service definition in docker-compose.yml
bd-service:
build:
context: '.'
dockerfile: 'dockerfiles/bd_heroku_service.Dockerfile'
args:
UID: "$UID"
command: bash -l -c "./bd-service/compile_hs_and_run.sh"
user: "$UID"
volumes:
- .:/app/user
Run Code Online (Sandbox Code Playgroud)
这是相关的 dockerfile:
# Inherit …Run Code Online (Sandbox Code Playgroud) 我使用Stack 工具创建了一个 Haskell CLI 。感谢 Travis,我刚刚成功设置了交叉编译,但我不明白为什么 linux (6MB)、osx (2MB) 和 windows (18MB!) 之间的可执行文件大小如此不同。怎么来的?
发布:https : //github.com/unfog-io/unfog-cli/releases/tag/v0.1.2
特拉维斯 conf:https : //github.com/unfog-io/unfog-cli/blob/master/.travis.yml
编辑
当我用 tar.gz 压缩可执行文件时,我减少了差异,但仍然如此!我现在有 linux (1.35MB)、osx (0.61MB)、windows (3.93MB)(见发布)