2013-07-08 14 views
8

New F # dự án đi kèm vớiLàm thế nào để thực hiện các dự án F # sẽ hoạt động tương tự trên bản xem trước VS2010/VS2013?

<Choose> 
    <When Condition="'$(VisualStudioVersion)' == '11.0'"> 
     <PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')"> 
     <FSharpTargetsPath>$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.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)" /> 

msbuild chỉ không thành công với nó vì vậy tôi thậm chí không thể viết một kịch bản xây dựng dựa trên hồ sơ dự án này.

Giải pháp của tôi:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\FSharp\Microsoft.FSharp.Targets" /> 

tôi đặt v12.0 thay vì $(VisualStudioVersion) vì VisualStudioVersion là 11 cho msbuild tôi. Vì vậy, nhưng điều này phá vỡ khả năng tương thích với các phiên bản Visual Studio khác.

Tôi đoán tôi cần phải thực hiện một cái gì đó giống nhau

<FSharpTargetsPath Condition="'$(VisualStudioVersion)' == '11.0'">$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets</FSharpTargetsPath> 

<FSharpTargetsPath Condition="'$(VisualStudioVersion)' == '12.0'">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath> 

Nhưng điều đó thậm chí không giống như nhau giải pháp tốt. Có cách nào đúng không?

Ngoài ra tôi có vấn đề với chạy 3,0 F # biên dịch fsc.exe và phần mềm cũng như FAKE:

Không thể tải tập tin hoặc lắp ráp FSharp.Core, Version = 4.3.0.0, Culture = trung tính, PublicKeyToken = b03f5f7f11d50a3a' hoặc một trong những phụ thuộc của nó

Vậy làm thế nào để không phá vỡ tính tương thích giữa 3.0/msbuild và 3.1 và các công cụ xem trước VS2013 mới hơn?

+1

Dự án VS2013 [được cho là tương thích ngược với VS2012] (https://blogs.msdn.com/b/fsharpteam/archive/2013/06/27/announcing-a-pre-release-of-f -3-1-and-the-visual-f-tools-in-visual-studio-2013.aspx? Redirected = true), mặc dù các dự án VS2012 yêu cầu nâng cấp một lần để tính năng này hoạt động. Nếu bạn đã nâng cấp dự án VS2012 lên VS2013 và bạn không thể xây dựng dự án này với VS2012 sau đó, bạn nên báo cáo vấn đề để có thể sửa lỗi cho VS2013 RTM. –

+0

Còn VS2010 thì sao? Tôi không có VS2012 để kiểm tra nếu điều này '' hoạt động ở đó. – Cynede

+0

Tôi không biết. Thông báo xem trước VS2013 không nói bất cứ điều gì về VS2010, vì vậy tôi sẽ làm điều đó có nghĩa là bạn sẽ không (dễ dàng) có thể tạo các tệp dự án hoạt động trên cả 3 phiên bản. –

Trả lời

2

Câu trả lời cụ thể hơn mà tôi đoán Danny nên đã đưa ra là:

<Choose> 
    <When Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#')"> 
     <PropertyGroup> 
     <FSharpSdkPathPrefix>$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#</FSharpSdkPathPrefix> 
     </PropertyGroup> 
    </When> 
    <Otherwise> 
     <Choose> 
     <When Condition="Exists('$(MSBuildExtensionsPath32)\..\..\..\..\Microsoft SDKs\F#')"> 
      <PropertyGroup> 
      <FSharpSdkPathPrefix>$(MSBuildExtensionsPath32)\..\..\..\..\Microsoft SDKs\F#</FSharpSdkPathPrefix> 
      </PropertyGroup> 
     </When> 
     <Otherwise> 
      <PropertyGroup> 
      <FSharpSdkPathPrefix></FSharpSdkPathPrefix> 
      </PropertyGroup> 
     </Otherwise> 
     </Choose> 
    </Otherwise> 
    </Choose> 
    <PropertyGroup> 
    <FSharpSdkPathSuffix>Framework\v4.0\Microsoft.FSharp.Targets</FSharpSdkPathSuffix> 
    </PropertyGroup> 
    <Choose> 
    <When Condition="'$(FSharpSdkPathPrefix)' == ''"> 
     <PropertyGroup> 
     <FSharpTargetsPath></FSharpTargetsPath> 
     </PropertyGroup> 
    </When> 
    <Otherwise> 
     <Choose> 
     <When Condition="Exists('$(FSharpSdkPathPrefix)\4.0\$(FSharpSdkPathSuffix)')"> 
      <PropertyGroup> 
      <FSharpTargetsPath>$(FSharpSdkPathPrefix)\4.0\$(FSharpSdkPathSuffix)</FSharpTargetsPath> 
      </PropertyGroup> 
     </When> 
     <Otherwise> 
      <Choose> 
      <When Condition="Exists('$(FSharpSdkPathPrefix)\3.1\$(FSharpSdkPathSuffix)')"> 
       <PropertyGroup> 
       <FSharpTargetsPath>$(FSharpSdkPathPrefix)\3.1\$(FSharpSdkPathSuffix)</FSharpTargetsPath> 
       </PropertyGroup> 
      </When> 
      <Otherwise> 
       <Choose> 
       <When Condition="Exists('$(FSharpSdkPathPrefix)\3.0\$(FSharpSdkPathSuffix)')"> 
        <PropertyGroup> 
        <FSharpTargetsPath>$(FSharpSdkPathPrefix)\3.0\$(FSharpSdkPathSuffix)</FSharpTargetsPath> 
        </PropertyGroup> 
       </When> 
       <Otherwise> 
        <PropertyGroup> 
        <FSharpTargetsPath></FSharpTargetsPath> 
        </PropertyGroup> 
       </Otherwise> 
       </Choose> 
      </Otherwise> 
      </Choose> 
     </Otherwise> 
     </Choose> 
    </Otherwise> 
    </Choose> 
    <Import Condition="'$(FSharpTargetsPath)' != ''" Project="$(FSharpTargetsPath)" /> 
    <Target Name="BeforeBuild"> 
    <Message Condition="'$(FSharpTargetsPath)' == ''" Importance="High" Text="F# SDK path was not found!" /> 
    </Target> 

này nên làm việc với tất cả các phiên bản.

0

Tôi sẽ bắt đầu bằng cách tạo dự án ở cả hai phiên bản và phân biệt các tệp dự án. Nếu bạn xây dựng một tệp dự án có chứa phần siêu của cả hai tệp, với các thuộc tính thích hợp Condition sao cho mỗi phiên bản của VS đọc các phần chính xác, theo lý thuyết nó sẽ hoạt động.

+0

Tôi chỉ hy vọng đề xuất này sẽ hoạt động nhưng tôi không thể xác nhận nó ngay bây giờ vì một số điều đã thay đổi, VS2013 đã hết và tôi không có cài đặt 2012 nữa vì vậy tôi thậm chí không thể đại diện cho vấn đề này một mình. – Cynede

Các vấn đề liên quan