2015-09-24 1 views
2

моей целью является просто вывести файл javascript, содержащий мою переведенную библиотеку F #. Больше ничего.Компилятор Websharper не может переводить другие сборки

У меня есть пустое решение, к которому я добавил два проекта F #. Одним из них является библиотека называется WSLib с одним файлом:

namespace WSLib 

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

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

Другой проект является консольным приложением и ссылки на WebSharper и WebSharper.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 компилятор работает с различными проектами? Я получаю ту же ошибку, если я включаю пакет WebSharper на WSLib и заменяю ReflectedDefinition на JavaScript.

ответ

3

Что происходит, так это то, что добавление WSLib.dll к ссылкам компилятора приведет только к тому, что он будет искать метаданные WebSharper в этой сборке, если таковые имеются; но WSLib уже должен быть скомпилирован WebSharper. Для того чтобы это произошло, вы должны ссылаться на WebSharper в WSLib (как вы сделали) и добавить следующее свойство в файле проекта:

<WebSharperProject>Library</WebSharperProject> 

поручить WebSharper, что он делает, скомпилировать эту сборку.