Как сделать F# проекты, которые будут работать так же на VS2010 / VS2013-preview?
Новые 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, культура = нейтральная, PublicKeyToken=b03f5f7f11d50a3a'или одна из ее зависимостей
Так как же не нарушить совместимость между 3.0 / msbuild и 3.1 и более новыми версиями VS2013-preview?
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>
Это должно работать со всеми версиями.
Я бы начал с создания проектов в обеих версиях и разметки файлов проекта. Если вы создаете файл проекта, который содержит расширенный набор обоих файлов, с соответствующими Condition
атрибуты, так что каждая версия VS читает правильные части, в теории это должно работать.