标题非常明显.我经常在调试时添加跟踪,这需要添加Debug.Trace导入.但是,当我完成时,我同样经常忘记删除那些.
我想要的是一个"dev"开关,可以添加导入,这样当我禁用它时,我可以很容易地找到代码中留下的所有痕迹.
我正在尝试将项目从cabal移动到堆栈.直到我试图让亚历克斯使用自定义包装器时,它才是无痛的.现在我被卡住了.
我以前使用cabal build --alex-options =".."来传递它们,但是那个选项不存在堆栈(至少堆栈版本1.1.2).同样,我曾经把调试标志传递给happy,但是现在它似乎不再可能了.有没有其他方法来实现这一点,仍然使用堆栈?
移动这个项目的目的是帮助协作者能够毫不费力地重现我的构建(说服他们使用Haskell已经有了一些工作).
如果我运行stack clean && stack build --profile,我得到的可执行文件比运行时慢stack clean && stack build,这很正常.
如果我运行stack clean && stack build --profile && stack build然后我得到一个同样慢的可执行文件,这一直持续到我运行stack clean && stack build
我已经rebuild-ghc-options: true在stack.yaml中设置了选项,但我要么不理解堆栈的正确使用,要么我以某种方式滥用它,因为我没有一个明确的心理模型,说明当我运行时状态会受到什么影响stack build.在我运行之前stack clean,它显然正在影响未来的构建,它是否也会影响依赖性?我如何确保在使用默认设置构建时,每次都获得相同的可执行文件?
编辑:让我说清楚,我理解机械上发生了什么,我明白stack build只重建"需要重建"的东西,如果我运行stack build我想要的东西就是重建所有需要进行发布构建的东西如果我刚刚使用性能分析构建,这意味着重建所有内容,那就这样吧.
编辑2:好的,我知道堆栈不知道发布或分析构建等,没有根本的区别,但是--profile只是改变了ghc标志吗?我想我要问的是,为什么不做rebuild-ghc-options锡上的说法呢?如果ghc选项发生变化,为什么不完全重建项目呢?那个国旗实际上做了什么?
我有一个可以构建和安装的软件应用程序stack.我想为Linux和Mac提供二进制包.为此,我正在考虑nix,因为除其他外,它可以在Linux和Mac中使用.这将节省我必须维护两种包类型的麻烦.
在阅读了如何nix定义包之后,我希望stack可以使用如下配置构建基于项目的项目:
{ stdenv, fetchurl, stack }: # we need to depend on stack
stdenv.mkDerivation {
name = "some-haskell-package-0.1";
builder = ./builder.sh; # here we would call `stack install`
src = fetchurl { # ...
};
}
Run Code Online (Sandbox Code Playgroud)
看一下在线可用的资源,我找不到任何关于如何做到这一点的描述.我不知道这是否意味着stack并且nix不打算以这种方式使用.
我能找到的手册中的唯一的事情就是如何stack可以使用nix,并且stack要nix转换工具.
我也愿意接受多平台包装的替代方案.
我正在运行Spock服务器并希望提供一些静态内容.我正在使用respondMiddleware"Web.Spock.Action"包中的函数.
签名是:
respondMiddleware :: Monad m => Middleware -> ActionCtxT ctx m a
Run Code Online (Sandbox Code Playgroud)
我使用staticPolicy"Network.Wai.Middleware.Static"软件包中的函数获取此"中间件"
staticPolicy :: Policy -> Middleware
Run Code Online (Sandbox Code Playgroud)
而"政策"则使用addBase来自"Network.Wai.Middleware.Static"的包
addBase :: String -> Policy
Run Code Online (Sandbox Code Playgroud)
这是我的代码块:
get ("/") $
respondMiddleware $ staticPolicy $ addBase ("static")
Run Code Online (Sandbox Code Playgroud)
该static有一个index.html和相关的JS和CSS文件,并将其放置在堆栈项目的根目录.我得到的错误是Failed to load resource: the server responded with a status of 400 (Bad Request)
我试图从我的Haskell代码构建一个Windows DLL.应该从C#中的托管代码调用此DLL中的函数.并且,从该DLL中的函数调用至少一个函数(在c#代码中定义).
冒着过度解释的风险,这是一个描绘我想要的小图:
+----------------------+ +------------------------+
| Managed C# code | | Haskell code (in DLL) |
| | (1) | |
| fn_calling_hs() -----------------> fn_called_from_cs() |
| | | |
| | | |
| fn_called_from_hs() <--------------- fn_calling_cs() |
| | (2) | |
+----------------------+ +------------------------+
Run Code Online (Sandbox Code Playgroud)
我设法使(1)完美地工作,即,DLL中的Haskell函数由C#代码调用,具有正确的结构和数组编组,并且Haskell中函数执行的结果也是正确的.到现在为止还挺好.
问题在于(2),即来自Haskell(在DLL中)调用C#中定义的托管函数的函数.问题在于构建本身 - 我还没有过去实际检查(2)的结果.
由于c#托管代码中的fn_called_from_hs()是在C#中定义的,因此我只在Haskell代码(在DLL中)中使用了函数符号"imported":
foreign import ccall fn_called_from_hs :: IO CString
Run Code Online (Sandbox Code Playgroud)
现在,当我使用堆栈构建我的Haskell项目时,它构建Haskell DLL没有问题,但构建继续也链接"main.exe" - 这显然失败了(显然),因为没有在任何地方定义的函数fn_called_from_hs() Haskell代码(它在c#中定义).
在构建HsDLL.dll之后,有什么办法可以阻止堆栈继续构建main.exe吗?我对HsDLL.dll具有未解析的符号(fn_called_from_hs())没问题,因为在由管理的C#代码加载此DLL期间,运行时链接程序将找到此符号.
到目前为止,我已尝试过这些步骤,但它们都没有帮助:
-no-hs-main在package.yaml中添加了GHC选项:包含HsDLL构建的package.yaml部分如下所示:
library:
source-dirs:
- src
- src/csrc
include-dirs: src/csrc
ghc-options:
- -shared
- …Run Code Online (Sandbox Code Playgroud)当谷歌搜索此错误时没有看到任何相关结果,所以我想将其发布。
stack build
Building all executables for `gitchapter' once. After a successful build of all of them, only specified executables will be rebuilt.
gitchapter-0.1.0.0: build (exe)
Preprocessing executable 'app' for gitchapter-0.1.0.0..
Building executable 'app' for gitchapter-0.1.0.0..
Preprocessing executable 'test' for gitchapter-0.1.0.0..
Warning: Enabling workaround for Main module 'Main' listed in 'other-modules'
Building executable 'test' for gitchapter-0.1.0.0..
illegaly!
<no location info>: error:
output was redirected with -o, but no output will be generated
because there is no Main module.
-- While …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 ubuntu (18.04) 主机上运行一些 haskell 代码,该代码是在我的笔记本电脑上编译的。
host: 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
laptop: 4.14.74-1-MANJARO #1 SMP PREEMPT Fri Oct 5 14:16:52 UTC 2018 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found
Run Code Online (Sandbox Code Playgroud)
经过一些研究,我了解到这是因为我的笔记本电脑安装了 glibc 2.28 版本,但主机只有 libc6 2.27。
我做了一些谷歌搜索,认为也许 docker 可以解决这个问题。但是,我刚刚使用以下 Dockerfile 创建了一个 docker 映像,但它不起作用(相同的 GLIBC_2.28 错误)
FROM fpco/stack-build:lts-12.9 as builder
RUN mkdir /opt/build
COPY . /opt/build
RUN cd /opt/build && stack build
FROM ubuntu:18.04
RUN mkdir -p /opt/myapp
WORKDIR /opt/myapp
RUN apt-get …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 Haskell 设置环境并安装堆栈。安装后我意识到 GHC 8.6.4 版本不是我需要的版本(8.0.2)。
compiler-exe: /home/manny/.stack/programs/x86_64-linux/ghc-tinfo6-
8.6.4/bin/ghc
compiler-bin: /home/manny/.stack/programs/x86_64-linux/ghc-tinfo6-
8.6.4/bin
compiler-tools-bin: /home/manny/.stack/compiler-tools/x86_64-linux-
tinfo6/ghc-8.6.4/bin
Run Code Online (Sandbox Code Playgroud)
所以我安装了GHC 8.0.2。我知道如果我更改全局配置文件,我可以解决问题,指示我想要的正确编译器,但是进行此类更改以避免编辑配置文件的正确命令是什么?
我试过:
stack config set --compiler ghc-8.0.2
Run Code Online (Sandbox Code Playgroud)
没有成功。我的编译器仍然是8.6.4。
~/.stack$ stack ghc -- --version
The Glorious Glasgow Haskell Compilation System, version 8.6.4
Run Code Online (Sandbox Code Playgroud)
谢谢你!
stack允许使用该stack.yaml文件将 git 存储库定义为包。是否可以直接通过命令行执行以下操作:
stack install --resolver=lts-12.1 git@github.com:saurabhnanda/some-repo.git
Run Code Online (Sandbox Code Playgroud)
用例:安装我在docker构建过程中编写的命令行工具。我想避免克隆 repo然后构建它。这有简写吗?
haskell ×10
haskell-stack ×10
ghc ×2
cabal ×1
docker ×1
haskell-ffi ×1
libc ×1
linux ×1
nix ×1
server ×1