小编rmu*_*unn的帖子

错误MSB4102:元素<Import>中"Project"属性的值""无效.参数"path"的长度不能为零.F#

我在Team city中构建项目时遇到以下错误.

同一个项目正在本地机器上构建.本地机器有VS 2015和F#4.0.

我的项目配置如下.

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />


    <Choose>
        <When Condition="'$(VisualStudioVersion)' == '11.0'">
          <PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\4.0\Framework\v4.0\Microsoft.FSharp.Targets')">
            <FSharpTargetsPath>$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\4.0\Framework\v4.0\Microsoft.FSharp.Targets</FSharpTargetsPath>
          </PropertyGroup>
        </When>
        <Otherwise>
          <PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets')">
            <FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath>
          </PropertyGroup>
        </Otherwise>
      </Choose>
      <Import Project="$(FSharpTargetsPath)" />
Run Code Online (Sandbox Code Playgroud)

这是控制台应用程序.

teamcity f# canopy-web-testing

9
推荐指数
1
解决办法
6814
查看次数

我完全不了解Angular数据绑定

我花了几个小时尝试这个代码的微小变化,我不明白为什么一个工作,另一个不工作.

Here's the scenario: I'm trying to present a list of registered users (which I'm getting with a simple database query that returns just a few columns), then when one user's name is clicked on, I'll retrieve more information about that user from the database, and present it in a different view. At the moment, I'm doing this with regular <a> elements with an ng-click directive that sets a value called currentid. Elsewhere in my code, I use $watch() …

javascript angularjs

7
推荐指数
1
解决办法
868
查看次数

在运行测试之前,如何让Karma的自动监视功能暂停?

我遇到了我认为是Vim保存文件和Karma重新运行我的Jasmine单元测试之间的竞争条件.这是一个四个测试运行的序列,演示了症状(我截断了错误日志中的极长路径):

$ karma start karma.conf.js --auto-watch
[... snip a lot of coding and test running ...]
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:19:57.252Z'
PhantomJS 1.6 (Linux): Executed 4 of 4 SUCCESS (0.307 secs / 0.013 secs)
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:20:09.866Z'
PhantomJS 1.6 (Linux): Executed 4 of 4 SUCCESS (0.288 secs / 0.012 secs)
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:20:14.366Z'
PhantomJS 1.6 (Linux) controller should have a breadcrumb after $routeChangeSuccess FAILED
        Error: No module: …
Run Code Online (Sandbox Code Playgroud)

javascript vim jasmine angularjs karma-runner

7
推荐指数
1
解决办法
1610
查看次数

在Clojure强制垃圾收集是一个好主意吗?

我有一个Clojure程序在运行时消耗了大量的堆(我曾经在2.8GiB附近测量它),我正试图找到一种方法来减少其内存占用.我目前的计划是每隔一段时间强制进行垃圾收集,但我想知道这是不是一个好主意.我已经阅读了如何在Java中强制进行垃圾收集?并且我可以强制垃圾收集在Java中?并了解如何做 - 只是打电话(System/gc)- 但我不知道这是一个好主意,或者即使它是需要的.

这是程序的工作原理.我有大量遗留格式的文档,我正在尝试将其转换为HTML.遗留格式由几个XML文件组成:描述文档的元数据文件,并包含指向任意数量内容文件的链接(通常为一个,但也可以是几个 - 例如,某些文档具有"主要"内容和单独的脚注文件).对于最小的文档,转换需要几毫秒到最大文档的大约58秒.基本上,我正在写一个荣耀的XSLT处理器,但在一个比XSLT更好的语言.

我刚刚开始在Clojure中编写的当前(相当天真)的方法构建了所有元数据文件的列表,然后执行以下操作:

(let [parsed-trees (map parse metadata-files)]
  (dorun (map work-func parsed-trees)))
Run Code Online (Sandbox Code Playgroud)

work-func将文件转换为HTML并将结果写入磁盘,然后返回nil.(我试图丢弃每个文档的解析后的XML树,这在每次通过单个文档后非常大).我现在意识到虽然map是懒惰并且dorun抛弃了它迭代的序列的头部,但是我抓住seq头部的事实parsed-trees是我失败的原因.

我的新计划是将解析移动到work-func,以便它看起来像:

(defn work-func [metadata-filename]
  (-> metadata-filename
      e/parse
      xml-to-html
      write-html-file)
  (System/gc))
Run Code Online (Sandbox Code Playgroud)

然后,我可以打电话work-funcmap,或者可能pmap因为我有两个双核CPU,并希望每个文档处理后扔掉的大型XML树.

不过,我的问题是:经常告诉Java"请跟我清理"是一个好主意吗?或者我应该跳过(System/gc)调用work-func,让Java垃圾收集器在需要时运行?我的直觉是要保持调用,因为我知道(因为Java不能)在那时work-func,堆上会有大量数据可以摆脱,但我会欢迎输入来自更有经验的Java和/或Clojure程序员.

java garbage-collection clojure

7
推荐指数
1
解决办法
2433
查看次数

相当于Array.scan |&gt; Array.skip 1,但是不创建中间数组?

Array.scan函数返回一个长度为 的数组n+1,其中n是其输入数组的长度,其第一项是传递给 的初始状态Array.scan。例如,

[|1;2;3;4|] |> Array.scan (+) 0  // Returns [|0;1;3;6;10|]
Run Code Online (Sandbox Code Playgroud)

但是,我通常发现这不是我想要的:我想要一个 length 数组n初始状态不会保留在我的输出数组中。我只需执行以下操作即可轻松获得此结果:

input |> Array.scan f initialState |> Array.skip 1
Run Code Online (Sandbox Code Playgroud)

但这将创建一个立即丢弃的中间数组。有没有一种好方法可以在不创建中间数组的情况下获得此结果?我可以很容易地自己实现:

let scanWithoutInitial f initState input =
    let result = Array.zeroCreate (Array.length input)
    let mutable state = initState
    for i = 0 to (Array.length input - 1) do
        state <- f state input.[i]
        result.[i] <- state
    result
Run Code Online (Sandbox Code Playgroud)

但是,重新实现我认为应该在标准 F# 核心库中的东西似乎需要做很多工作。有没有我忽略的功能?或者我是这个用例中唯一的一个,并且大多数人希望初始值作为他们Array.scan结果的第一项?

f#

7
推荐指数
1
解决办法
359
查看次数

如何阻止 MSBuild 用正斜杠替换反斜杠?

MSBuild 通常会用正斜杠替换构建文件中的反斜杠(通常在路径中找到),这在处理跨平台项目时很有帮助。但我有一个任务,我不希望 MSBuild 触及我的反斜杠:我们的构建中有一个自定义任务,它采用正则表达式和替换任务,并更新文件。(我使用它来更新 AssemblyInfo.cs 文件中的版本号,从 获取版本号git describe。有一个 TeamCity 构建功能,只要我能够控制它的运行时间,它就可以工作,但这是一个不同的故事 - 足以说在我的 MSBuild 文件中执行此操作看起来是目前最好的方法)。

我的问题是,MSBuild 通过在我传递给自定义任务的属性中用正斜杠替换反斜杠来“帮助”我,这对我的正则表达式造成了严重破坏。我写的:

<FileUpdate File="$(RootDir)/GlobalAssemblyInfo.cs"
            Regex='AssemblyFileVersion\("[^"]+"\)'
            ReplacementText='AssemblyFileVersion("$(VersionNumber)")' />
Run Code Online (Sandbox Code Playgroud)

我在构建日志中得到了什么:

error : Did not manage to replace 'AssemblyFileVersion/("[^"]+"/)' with 
        'AssemblyFileVersion/("1.1.0.92"/)'
Run Code Online (Sandbox Code Playgroud)

请注意我的正则表达式中的反斜杠是如何变成正斜杠的?是的,这不会与我的 AssemblyInfo.cs 文件中的任何内容匹配。

我已经能够通过完全避免在正则表达式中使用反斜杠来解决这个问题,如下所示:

<FileUpdate File="$(RootDir)/GlobalAssemblyInfo.cs"
            Regex='AssemblyFileVersion[(]"[^"]+"[)]'
            ReplacementText='AssemblyFileVersion("$(VersionNumber)")' />
Run Code Online (Sandbox Code Playgroud)

但这并不适用于所有情况。迟早我会需要一个正则表达式 with \,或者其他一些反斜杠表达式,然后我就会陷入困境。在此之前,我真的很想弄清楚如何告诉 MSBuild“停止帮助我!我说反斜杠,我真正的意思是反斜杠,而不是正斜杠,在这个 ONE 属性中。您可以使用其他属性“帮助”我你喜欢,但别管这个!” 有任何想法吗?

msbuild msbuild-4.0

6
推荐指数
1
解决办法
1289
查看次数

哪个与缩进规则匹配在这里?

这个缩进工作正常:

match 5 with
| k when k < 0 ->
  "value is negative"
| k -> "value is non-negative"
|> printfn "%s"
Run Code Online (Sandbox Code Playgroud)

但这不是:

match 5 with
| k when k < 0 ->
  "value is negative"
| k ->
  "value is non-negative"
|> printfn "%s"
Run Code Online (Sandbox Code Playgroud)

哪个F#缩进规则正在发挥作用?

f# indentation

6
推荐指数
1
解决办法
94
查看次数

函数类型为'T - > Async <'T>,如C#的Task.FromResult

我正在玩异步编程,并且想知道是否存在可以获取类型值'T并将其转换为类型的函数Async<'T>,类似于C#Task.FromResult,它可以获取类型的值TResult并将其转换为Task<TResult>可以等待的类型.

如果F#中不存在这样的功能,是否可以创建它?我可以通过使用Async.AwaitTask和Task.FromResult来模拟这个,但是我可以通过仅使用Async来实现吗?

从本质上讲,我希望能够做到这样的事情:

let asyncValue = toAsync 3 // toAsync: 'T -> Async<'T>

let foo = async{      
  let! value = asyncValue
}
Run Code Online (Sandbox Code Playgroud)

f# asynchronous

6
推荐指数
2
解决办法
207
查看次数

我可以更改 git-describe 计算提交的方式吗?

我的问题与git describe: inexplicable commit countcommit countcalculation in git-describe有关,但与两个问题都不完全相同。我一直在当前项目中的功能分支上进行开发,并且一直用于获取功能分支的版本号,使用最近的标签和提交计数来生成我认为会单调递增的git describe版本号。(例如,我的分支目前在 v1.1.0 之前有 96 次提交,因此我在向用户报告的版本中已将其变为“版本 1.1.0.96”。)v1.1.0-96-g1234567

现在,master 分支最近被标记为 v1.2.0,我想将 1.2 版本中所做的更改合并到我的功能分支中。所以我将 master 合并到我的功能分支中,我认为这git describe会产生v1.2.0-1-g9876543. 但相反,我得到了v1.2.0-97-g9876543

我理解为什么会发生这种情况:正如 Git 手册中所述,git describe正在计算 产生的提交数以git log v1.2.0..9876543产生提交计数(97,因为我的分支有 96 次提交加上一次合并提交)。但我真正想要的是使用结果git log --ancestry-path v1.2.0..9876543,它只显示合并提交,因此会产生v1.2.0-1-g9876543我期望的结果。

有什么办法可以让我改变git describe使用git log --ancestry-path v1.2.0..9876543而不是的行为吗git log v1.2.0..9876543

而且,更重要的是,按照目前的方式这样做有什么好处git describe?如果我编写自己的工具来生成我一直期望的版本编号方案,那么我会失去什么?

顺便提一句。这是 git 存储库历史记录的快照,因此您可以直观地看到我刚才描述的内容。该feature/cmdline …

git merge git-describe

5
推荐指数
0
解决办法
592
查看次数

F#中的静态构造函数 - 它们什么时候运行?

我正在尝试用F#创建单身的各种方法,这样我就能更好地理解细微之处.我不知道单身模式在F#中是否有用,但我想尝试一下.我对这些单例实例中涉及静态构造函数的一个结果感到惊讶.首先,我将向您展示我的代码,然后我会详细介绍我的问题.

在一个名为的项目中TrySingleton,我创建了三个模块.这是Eager.fs:

module TrySingleton.Eager

type EagerClass() =
    do
        printfn "Initializing eager class..."

    static do
        printfn "Static constructor of eager class"

let Instance = EagerClass()
Run Code Online (Sandbox Code Playgroud)

这是Lazy.fs:

module TrySingleton.Lazy

type LazyClass() =
    do
        printfn "Initializing lazy class..."

    static do
        printfn "Static constructor of lazy class"

let Instance = lazy LazyClass()
Run Code Online (Sandbox Code Playgroud)

以下是我称之为Main.fs:

module TrySingleton.Main

[<EntryPoint>]
let main argv =
    printfn "Starting main with args %A" argv
    printfn "Accessing eager instance:"
    printfn "%A" Eager.Instance …
Run Code Online (Sandbox Code Playgroud)

singleton f# static constructor lazy-loading

5
推荐指数
1
解决办法
679
查看次数