2013-07-08 7 views
8

New F # проектов поставляется сКак сделать проекты F #, которые будут работать на VS2010/VS2013-preview?

<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, Version = 4.3.0.0, культура = нейтральной, PublicKeyToken = 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-и-visual-f-tools-in-visual-studio-2013.aspx? Redirected = true), хотя для проектов VS2012 требуется одноразовое обновление для этого. Если вы обновили проект VS2012 до VS2013, и впоследствии вы не сможете его построить с помощью VS2012, вы должны сообщить об этой проблеме, чтобы ее можно было исправить для RTM VS2013. –

+0

Что относительно VS2010? У меня нет VS2012, чтобы проверить, работает ли этот '''. – Cynede

+0

Не знаю. Объявление предварительного просмотра VS2013 ничего не говорило о VS2010, поэтому я предполагаю, что вы не сможете (легко) создавать файлы проектов, которые работают во всех трех версиях. –

ответ

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