поставщик типа не распознается при создании проекта

Я использую VS 2012 Trial и библиотеку FSharp.Data для XML разбора. Когда я создаю проект, вся информация о поставщике типов превращается в ошибки, что приводит к отказу от компиляции, например:

Обновление — вывод после попытки сборки (Framework 4.5)

------ Build started: Project: temp3, Configuration: Debug Any CPU ------
C:\Program Files (x86)\Microsoft SDKs\F#\3.0\Framework\v4.0\fsc.exe 
-o:obj\Debug\temp3.dll -g --debug:full --noframework --define:DEBUG 
--define:TRACE --doc:bin\Debug\temp3.XML --optimize- --tailcalls- 
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\FSharp.Core.dll" 
-r:C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\packages\FSharp.Data.1.1.9\lib\net40\FSharp.Data.DesignTime.dll 
-r:C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\packages\FSharp.Data.1.1.9\lib\net40\FSharp.Data.dll 
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll" 
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Core.dll" 
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll" 
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Numerics.dll" 
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Xml.Linq.dll" 
--target:library --warn:3 --warnaserror:76 --vserrors --validate-type-providers 
--LCID:1033 --utf8output --fullpaths --flaterrors --subsystemversion:6.00 
--highentropyva+ "C:\Users\Laura\AppData\Local\Temp\.NETFramework,Version=v4.5.AssemblyAttributes.fs" Library1.fs 
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(31,122): 
error FS0039: The type 'Transaction' is not defined
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(32,21): 
error FS0072: Lookup on object of indeterminate type based on information 
prior to this program point. 
A type annotation may be needed prior to this program point to constrain 
the type of the object. This may allow the lookup to be resolved.
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(33,85): 
error FS0039: The field, constructor or member 'Postdate' is not defined
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(34,38): 
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate 
type based on information prior to this program point. Consider adding 
further type constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(34,74): 
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type 
based on information prior to this program point. Consider adding further type 
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(34,118): 
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type 
based on information prior to this program point. Consider adding further type 
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,39):     
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type 
based on information prior to this program point. Consider adding further type 
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,68): 
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type 
based on information prior to this program point. Consider adding further type 
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,93): 
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type 
based on information prior to this program point. Consider adding further type 
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,125): 
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type 
based on information prior to this program point. Consider adding further type 
constraints
Done building project "temp3.fsproj" -- FAILED.

Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

Завершить обновление

The type 'Transaction' is not defined

а также

Look up on object of indeterminate type based on information prior to this 
program point. A type annotation may be needed prior to this program point
to constrain the type of the object. This may allow the lookup to be resolved.

а также

The field, constructor or member 'Postdate' is not defined

У меня есть open Fharp.Data над моим модулем и ссылка System.Xml.Linq.

Файл моего решения: https://dl.dropboxusercontent.com/u/74660436/temp3.zip

Мой файл XML: https://dl.dropboxusercontent.com/u/74660436/KMyMoneySampleFile.xml

Образец кода:

namespace KMyMoney
open System.IO
open System.IO.Compression
open FSharp.Data

module Read =

    let decompressFileAndRead sourceFile = (new StreamReader(new GZipStream(File.OpenRead(sourceFile), CompressionMode.Decompress))).ReadToEnd()

    type KMyMoney = XmlProvider<"KMyMoneySampleFile.xml">

    let kMyMoney (sourceData:string) = KMyMoney.Load(sourceData)

    let getAccountNames sourceData = 
        (kMyMoney sourceData).Accounts.GetAccounts()
        |> Array.map (fun acc -> acc.Id, acc.Name)
        |> Map.ofArray

    let getPayeeNames sourceData =
        (kMyMoney sourceData).Payees.GetPayees()
        |> Array.map (fun p -> p.Id, p.Name)
        |> Map.ofArray

    type TransactionNew = {Id:string; Commodity:string; Date:System.DateTime; Account:string option; Amount:float; Payee:string option
                        ; Category:string option; Number:string; Memo:string; Shares:float}

    let amount (value:string) =
        let divideArray (values:float[]) = values.[0]/values.[1]
        value.Split("/".[0]) |> Array.map float |> divideArray

    let splitTransaction (accNames:Map<string,string>) (payeeNames:Map<string,string>) (transaction:KMyMoney.DomainTypes.Transaction) =
        let split = transaction.Splits.GetSplits()
        {Id = transaction.Id; Commodity = transaction.Commodity; Date = transaction.Postdate
        ; Account = accNames.TryFind(split.[0].Account); Amount = amount split.[0].Value; Payee = payeeNames.TryFind(split.[1].Payee)
        ; Category = accNames.TryFind(split.[1].Account); Number = split.[0].Number; Memo = split.[0].Memo; Shares = amount split.[0].Shares}

person Jon49    schedule 26.08.2013    source источник
comment
Я описал некоторые распространенные причины этой ошибки здесь: /questions/16343876/ - возможно, это один из них...   -  person Tomas Petricek    schedule 27.08.2013
comment
@TomasPetricek, наконец-то я проверил твои три идеи. К сожалению, ни один из них не применим к моей ситуации. Я изучил все три, и на моей стороне все работало нормально для проблем, на которые вы указываете. Думаю, мне придется продолжать попытки найти решение. Спасибо за вашу помощь!   -  person Jon49    schedule 28.08.2013
comment
Еще одна вещь, которую можно попробовать, — это создать пустой файл сценария и использовать #r для ссылки на библиотеку оттуда. Затем проверьте, появилось ли сообщение об ошибке в строке #r.   -  person Tomas Petricek    schedule 28.08.2013
comment
Другая возможная проблема может заключаться в том, что DLL поставщика типов находится на каком-то сетевом ресурсе...   -  person Tomas Petricek    schedule 28.08.2013
comment
@TomasPetricek, это только на моем единственном компьютере. Я попробую #r и посмотрю, что произойдет.   -  person Jon49    schedule 28.08.2013
comment
Хорошо, я получаю ту же ошибку: stdin(33,118): error FS0039: Тип «Транзакция» не определен › C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp\temp\MReadKMyMoney.fs( 34,126): ошибка FS0039: Тип «Транзакция» не определен   -  person Jon49    schedule 28.08.2013
comment
Я попробовал это, используя последнюю версию поставщика типов XML и предоставленный вами пример файла, и он отлично работает для меня, поэтому должна быть какая-то проблема с загрузкой поставщика типов. Вы уверены, что вызываете компилятор F# 3.0?   -  person Tomas Petricek    schedule 29.08.2013
comment
Я удалил FSharp 2.0, надеясь, что это решит проблему, так как я читал, что у 2.0 были проблемы с 1.0. Я заметил, что не уловил первый вывод с надписью warnaserror76. Поэтому я опубликую всю строку в своем вопросе. Не уверен, что мне следует просто удалить все версии VS, а затем переустановить VS2012. Кажется радикальным, но я не уверен, что еще делать.   -  person Jon49    schedule 01.09.2013
comment
Из o/p, который я опубликовал, видно, что я использую F# 3.0.   -  person Jon49    schedule 01.09.2013
comment
@TomasPetricek, не могли бы вы протестировать мой файл тестового решения? Я пытался найти решение для этого, но пока ничего не нашел :-/ dl.dropboxusercontent.com/u/74660436/temp3.zip   -  person Jon49    schedule 05.09.2013
comment
Спасибо, что поделились - я смог воспроизвести это, поэтому я полагаю, что это может быть какая-то ошибка в поставщике XML. Я расследую...   -  person Tomas Petricek    schedule 05.09.2013


Ответы (1)


Решение. Эта проблема устранена в FSharp.Data 1.1.10 (nuget). Смотрите комментарии ниже.


Обновление: у меня та же проблема, но со следующим кодом:

module XmlTypeProviderIssue

open System
open FSharp.Data

type Html = XmlProvider<"""
<div>
    <span>
        <ul>
            <li/>          
        </ul>
    </span>  
</div>""">

let html = Html.GetSample()

// Div is defined
let divWorks (div:Html.DomainTypes.Div) = ()

// Span is defined
let spanWorks (span:Html.DomainTypes.Span) = ()

// Ul is not
let ulBreaks (ul:Html.DomainTypes.Ul) = ()

// and neither is Li
let liBreaks (li:Html.DomainTypes.Li) = ()

По сути, DomainTypes появляются в intellisense, но компилятор выдает ошибку Error FS0039: The type 'Ul' is not defined (FS0039), и то же самое для 'Li'.


Исходный ответ: у меня нет для вас подходящего ответа, но что интересно, если вы удалите тег <TRANSACTIONS></TRANSACTIONS> из своего XML, он будет нормально строиться.

То есть изменить это:

<TRANSACTIONS count="2">
  <TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
   <SPLITS>
    <SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
    <SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
   </SPLITS>
  </TRANSACTION>
  <TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
   <SPLITS>
    <SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
    <SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
   </SPLITS>
  </TRANSACTION>
</TRANSACTIONS>

к этому:

<TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
   <SPLITS>
    <SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
    <SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
   </SPLITS>
  </TRANSACTION>
  <TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
   <SPLITS>
    <SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
    <SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
   </SPLITS>
</TRANSACTION>
person Troy Kershaw    schedule 05.09.2013
comment
Интересно. Интересно, почему это вызвало проблему. Я думаю, это показывает, что ошибка находится на стороне Type Provider. Спасибо! Вы получили его, чтобы я мог скомпилировать, если я не знаю, будет ли проект работать или нет, если я уберу тег Transactions. Я дам вам 100 в конце 6 дней. Я немного повременю, на всякий случай, если мне нужно будет наградить других тоже баллами. Не знаю, как перевести очки - я уверен, что это возможно. - person Jon49; 05.09.2013
comment
Я не просматривал исходный код провайдера типа XML, чтобы увидеть, есть ли проблема, но это, безусловно, стоит посмотреть. Мне удалось воссоздать это с помощью более простого примера XML, поэтому я приведу его в чистое состояние, опубликую, и, возможно, кто-то сможет пролить свет на проблему. - person Troy Kershaw; 06.09.2013
comment
@TroyKershaw Если у вас есть простая реплика, добавьте ссылку на отчет об ошибке на GitHub: github.com/fsharp/FSharp.Data/issues/189 - person Tomas Petricek; 06.09.2013
comment
@TomasPetricek я добавил Gist к проблеме GitHub выше. - person Troy Kershaw; 06.09.2013
comment
@TroyKershaw Спасибо, посмотрю! - person Tomas Petricek; 07.09.2013
comment
@ Jon49 Jon49 У проблемы с Github, описанной выше, есть решение. Я не уверен, когда будет выпуск на Nuget, поэтому вам, возможно, придется пока собирать из исходного кода. - person Troy Kershaw; 13.09.2013
comment
@TroyKershaw Спасибо, Трой! - person Jon49; 13.09.2013
comment
Это исправление было выпущено в FSharp.Data 1.1.10 nuget.org/packages/ FSharp.Data/1.1.10 - person Gustavo Guerra; 13.09.2013
comment
Вау, вы, ребята, быстро двигаетесь! - person Troy Kershaw; 13.09.2013