我很惊讶我找不到任何关于此的文档,但无论如何......
有时我的 TeamCity 构建会挂起,我最终需要停止它。构建过程会在磁盘上生成多个日志文件,然后 TeamCity 将其发布为构建工件。但是,如果我停止构建,TeamCity 将拒绝发布日志:
Build was interrupted. Artifacts will not be published for this build
Run Code Online (Sandbox Code Playgroud)
这些文件仍然存在于磁盘上,只是 TeamCity 不再发布它们。这尤其令人恼火,因为我真的非常需要查看这些日志中的内容,以便我可以找出构建首先挂起的原因。
有什么方法可以强制 TeamCity 始终发布构建工件,即使我必须中止构建?
(我看到几个问题询问如何在构建失败时停止TeamCity 发布工件,所以我有点困惑为什么我的设置还没有这样做,但无论如何......)
附言。我意识到我可以手动登录构建服务器来查看日志,但 TeamCity 的全部意义就是为我自动化类似的事情......
我正在使用大量未记录的 Castle 动态代理系统。我已经设法让它做我想做的几乎所有事情,除了一件事:如何让代理方法抛出异常而不是返回值?
public sealed class MyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
if (CheckArgs(invocation.Arguments))
{
invocation.ReturnValue = DoRealWork(invocation.Arguments);
}
else
{
invocation.Exception = new InvalidOperationException(); // How?
}
}
}
Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
magic :: String -> Q Exp magic s = [e| putStrLn s |]
现在,尽我所知,这实际上不应该起作用.在牛津括号内,s不在范围内.然而,上述显然完美无缺.
如果我们稍微改变这个例子,它现在可怕地破坏了:
magic :: Exp -> Q Exp magic (VarE n) = [e| putStrLn (nameBase n) |]
就像以前一样,我们有一个不在范围内的变量.而这一次,它打破了.但它没有抱怨不在范围内的变量; 相反,它抱怨一些没有实例的无证件类.
谁知道到底发生了什么?
我正在编写一个会生成大量数据的程序.我想找到关于这些数据的各种百分位数.
显而易见的方法是将数据存储在某种排序容器中.是否有任何Haskell库提供一个自动排序的容器,并提供对任意索引的快速随机访问?
另一种方法是使用无序容器并在最后执行排序.我不知道这是否会更快.无论哪种方式,我们仍然需要一个提供快速随机访问的容器.(数组,也许......)
建议?
(另一个选择是建立一个直方图,而不是将整个数据集保存在内存中.但由于目标是非常准确地计算百分位数,我不愿意沿着那条路走下去.我也不知道我的范围数据,直到我生成它...)
标准库包括一个函数
unzip :: [(a, b)] -> ([a], [b])
Run Code Online (Sandbox Code Playgroud)
定义这个的明显方法是
unzip xs = (map fst xs, map snd xs)
Run Code Online (Sandbox Code Playgroud)
但是,这意味着遍历列表两次以构造结果.我想知道的是,有没有办法只用一次遍历来做到这一点?
附加到列表是昂贵的 - 事实上是O(n).但是,正如任何新手都知道的那样,我们可以巧妙地利用懒惰和递归来"附加"到带有递归调用的列表中.因此,zip可以很容易地实现为
zip :: [a] -> [b] -> [(a, b)]
zip (a:as) (b:bs) = (a,b) : zip as bs
Run Code Online (Sandbox Code Playgroud)
但是,只有当您返回一个列表时,此技巧才会起作用.我无法看到如何扩展它以允许同时构造多个列表的尾部而不会结束重复源遍历.
我一直认为,该unzip标准库的管理要做到这一点在一个遍历(这是一种实现在图书馆这个本来平凡函数的整点),但我真的不知道它是如何工作.
一旦安装了Stack,就可以使用它来为您安装GHC。大!
...现在如何用它编译文件?
需要明确的是:您应该做的是编写一个程序包规范,并使用Stack构建该规范。但是,肯定有一种方法可以在该项目中轻松编译一个小的辅助文件吗?不得不构建一个整个项目只是为了使我可以构建一个小的帮助程序并使之易于从Shell运行,这似乎很愚蠢。
我知道我可以使用Stack 运行任何Haskell文件。但是我无法为自己的生活弄清楚如何编译该东西...
我发誓我在最近的一系列GHC发行说明中看到了一个新功能 - 但现在我找不到它的参考.我是妄想,还是这个功能确实存在?
这与加载不完整的模块有关.尽我所知,它允许您关闭由于未定义的变量导致的编译错误.(当然,在运行时,如果您尝试实际使用未定义的变量,则会导致异常抛出.)这听起来很熟悉吗?或者我的想法是这样做的?
常见的初学者错误是看到return并认为它是一个语言关键字,它以退货值退出当前函数.当然,我们知道它根本不是它的功能.但我想知道......我们真的可以做出这样的功能吗?纯粹出于争论的缘故,此时此刻.
看来我们正在寻找一些Foo具有功能的monad
exit :: x -> Foo x
Run Code Online (Sandbox Code Playgroud)
这将中止其余的计算并立即返回x.
这样的事情是可构建的吗?如果它可以构建,它会有用吗?尝试做这个甚至是理智的事情吗?
请考虑以下类型声明:
data Foobar x = Foo (x (Foobar x))
Run Code Online (Sandbox Code Playgroud)
现在Show为此编写一个实例.我赌你!
我随便写道deriving Show,期待GHC做到这一点.但它抱怨它无法做到.我想,"可怜的傻瓜",并开始自己定义.但是......嗯......哦,实际上那很有意思......显然Foobar x只有在x y可以展示的时候才能展示y......或......那样的东西...... aaargh!
现在我确定我不可能成为第一个定义这种类型的人.而且我不能成为第一个想要Show它的实例的人.所以有人必须弄清楚如何做到这一点.
好的,所以这是一个不寻常的.每当你看到Haskell的记录语法的例子时,它总是看起来像
Sphere {center = 0, radius = 2}
Run Code Online (Sandbox Code Playgroud)
或类似的.我的问题是......那些大括号实际上是记录语法的一部分吗?或者它们实际上是布局的简写?换句话说,你真的能写出像
Sphere
center = 0
radius = 2
Run Code Online (Sandbox Code Playgroud)
它有用吗?
我怀疑这样做会非常有用 - 它占用了大量的视觉空间 - 但我只是好奇这是否在语法上有效.