f# - Webshaper 编译器无法翻译其他程序集

标签 f# websharper

我的目标是简单地输出一个包含我翻译的 F# 库的 javascript 文件。仅此而已。

我有一个空解决方案,其中添加了两个 F# 项目。一个是名为 WSLib 的库,带有单个文件:

namespace WSLib

[<ReflectedDefinition>]
type Class1() = 
    member this.X = "F#"

[<ReflectedDefinition>]
module Foo =
  let bar = 34

另一个项目是一个控制台应用程序,并引用 WebSharperWebSharper.Compiler NuGet 包。它有一个文件。我从 http://www.fssnip.net/snippet/rP 复制了前半部分代码.

module Program

open Microsoft.FSharp.Quotations
open WebSharper
type AR = IntelliFactory.Core.AssemblyResolution.AssemblyResolver

module FE = WebSharper.Compiler.FrontEnd

let compile (expr: Expr) : string option =
    let loader = FE.Loader.Create (AR.Create()) (eprintfn "%O")
    let options =
        { FE.Options.Default with
            References =
                List.map loader.LoadFile [
                    // These contain the JavaScript implementation for most of the standard library
                    "WebSharper.Main.dll"
                    "WebSharper.Collections.dll"
                    "WebSharper.Control.dll"
                    "WSLib.dll"
                    // Add any other assemblies used in the quotation...
                ] }
    let compiler = FE.Prepare options (sprintf "%A" >> System.Diagnostics.Debug.WriteLine)
    compiler.Compile expr
    |> Option.map (fun e -> e.ReadableJavaScript)

[<JavaScript>]
let main() =
  let a = WSLib.Class1().X
  let b = WSLib.Foo.bar
  (a,b)

let code = 
  match (compile <@ main() @>) with
  |None -> failwith "parse failed"
  |Some x -> x

open System.IO

let filePath = Path.Combine(System.Environment.CurrentDirectory, "index.js") 
File.WriteAllText(filePath, code) 

我收到几个错误:

{Location = {ReadableLocation = "main";
             SourceLocation = null;};
 Priority = Error;
 Text = "Failed to translate property access: X [WSLib.Class1].";}
{Location = {ReadableLocation = "main";
             SourceLocation = null;};
 Priority = Error;
 Text = "Failed to translate property access: bar [WSLib.Foo].";}

我需要做什么才能让 websharper 编译器处理不同的项目?如果我在 WSLib 上包含 WebSharper 包并将 ReflectedDefinition 替换为 JavaScript,我会收到相同的错误。

最佳答案

这里发生的情况是,将 WSLib.dll 添加到编译器引用只会使其在该程序集中查找 WebSharper 元数据(如果有);但 WSLib 需要已进行 WebSharper 编译。为此,您需要在 WSLib 中引用 WebSharper(就像您所做的那样),并将以下属性添加到项目文件中:

<WebSharperProject>Library</WebSharperProject>

指示 WebSharper 它必须编译此程序集。

关于f# - Webshaper 编译器无法翻译其他程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32767051/

相关文章:

f# - 使用 SRTP 在 F# 中实现无标记最终编码

f# - FSharp 在基类中调用泛型方法

具有单子(monad)绑定(bind)的 F# 尾递归

wpf - 使用 WPF 和 F# 嵌入应用程序图标

f# - 有没有办法默认使用 JavaScript 属性?

f# - 如何使用WebSharper翻译器?

f# - 在 F# 中,是否可以为元组实现运算符?

f# - 有没有一种方法可以有效地将reactjs与WebSharper结合使用

f# - 保护多个参数化页面

f# - Websharper : Using LI tags