2013-07-08 47 views
8

新的F#項目帶有如何製作在VS2010/VS2013預覽中工作相同的F#項目?

<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只是失敗,所以我甚至可以不寫基於此項目文件的生成腳本。

我的解決辦法:

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

我設置v12.0,而不是$(VisualStudioVersion)因爲VisualStudioVersion是11我的MSBuild。所以,但這打破了與其他Visual Studio版本的兼容性。

我想我需要的東西都

<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> 

但是,即使是不一樣好看的解決方案。有沒有正確的方法?

我也有與運行問題3.0 F#編譯器fsc.exe和軟件都FAKE

無法加載文件或程序集FSharp.Core,版本= 4.3.0.0,文化=中性公鑰= b03f5f7f11d50a3a」或它的依賴之一

那麼如何不打破3.0/msbuild和3.1之間的兼容性和更新的VS2013-預覽的東西?

+1

VS2013項目[應該與VS2012向後兼容](https://blogs.msdn.com/b/fsharpteam/archive/2013/06/27/announcing-a-pre-release-of-f -3-1-and-visual-f-tools-in-visual-studio-2013.aspx?Redirected = true),但VS2012項目確實需要一次性升級才能運行。如果您已將VS2012項目升級到VS2013,並且之後無法使用VS2012構建VS2012項目,則應報告該問題,以便VS2013 RTM能夠修復此問題。 –

+0

VS2010呢?我沒有VS2012來測試這個''在那裏工作。 – Cynede

+0

我不知道。 VS2013預覽公告沒有提及VS2010的任何內容,所以我會認爲你不會(很容易)能夠創建適用於所有3個版本的項目文件。 –

回答

2

,我想丹尼應該給出的更具體的回答是:

<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> 

這應該與所有版本。

0

我會先在兩個版本中創建項目並區分項目文件。如果你創建一個包含兩個文件超集的項目文件,並且有合適的Condition屬性,這樣VS的每個版本都可以讀取正確的部分,理論上它應該可以工作。

+0

我只是希望這個建議能夠正常工作,但是現在我不能確認它,因爲有些事情發生了變化,VS2013已經停產,我還沒有安裝2012版本,所以我甚至不能代表我自己來解決這個問題。 – Cynede

相關問題