Уже довольно давно я пользуюсь няшным шаблоном для VS, который помогает в пару кликов мышки создать проект F#, в котором легко можно делать матричные операции с помощью Math.Net Numerics, использовать HtmlAgilityPack и рисовать графики с помощью FSharpChart:
Я сделал этот шаблон, когда понял, что если ещё один раз буду вручную добавлять все нужные библиотеки — повешусь. Тем не менее, сам процесс создания шаблона не обошёлся без пары gotchas, так что я решил записать его; сейчас же перепишу его сюда и приложу сам шаблон, на благо общественности.
В шаблоне используются библиотеки, добытые с помощью NuGet'a и скрипт FSharpChart. Все права на всё принадлежат тем, кому они принадлежат ^_^.
АлгоритмЪ:
- Создать обычный проект F#, включить в него все нужные библиотеки и файлы, загрузить все нужные NuGet-пакеты, написать весь boilerplate код. В моём случае это выглядело так:
#if INTERACTIVE //Math.Net Numerics #r @"..\packages\MathNet.Numerics.2.1.2\lib\Net40\MathNet.Numerics.dll" #r @"..\packages\MathNet.Numerics.FSharp.2.1.2\lib\Net40\MathNet.Numerics.FSharp.dll" //PowerPack #r @"..\packages\FSPowerPack.Community.2.1.1.1\Lib\Net40\FSharp.PowerPack.dll" #r @"..\packages\FSPowerPack.Community.2.1.1.1\Lib\Net40\FSharp.PowerPack.Linq.dll" #r @"..\packages\FSPowerPack.Community.2.1.1.1\Lib\Net40\FSharp.PowerPack.Metadata.dll" #r @"..\packages\FSPowerPack.Community.2.1.1.1\Lib\Net40\FSharp.PowerPack.Parallel.Seq.dll" //FSharpChart #r @"..\packages\MSDN.FSharpChart.dll.0.60\lib\MSDN.FSharpChart.dll" #load "FSharpChart.fsx" //HtmlAgility #r @"..\packages\HtmlAgilityPack.1.4.3\lib\HtmlAgilityPack.dll" #r @"System.Xml" #r @"System.Xml.Linq" #endif open System open System.Collections.Generic open System.Linq open System.Text open System.IO open System.Drawing open System.Windows.Forms open System.Windows.Forms.DataVisualization.Charting open System.Xml open System.Xml.Linq open MathNet.Numerics open MathNet.Numerics.FSharp open MathNet.Numerics.LinearAlgebra.Double open MathNet.Numerics.LinearAlgebra.IO open MathNet.Numerics.Distributions open MSDN.FSharp.Charting //FSharpChart open HtmlAgilityPack //HtmlAgility open Microsoft.FSharp.Math //PowerPack
File > Export Template...
- Получится .zip файл, в корневую папку которого надо вставить все .nupkg файлы:
- В файле
MyTemplate.vstemplate
надо поменять метаданные в разделеTemplateData
:<TemplateData> <Name>Data Analysis App Extended</Name> <Description>Data Analysis Application with installed Math.Net Numerics, FSharpChart, HtmlAgility and F# PowerPack libraries.</Description> <ProjectType>FSharp</ProjectType> ... </TemplateData>
- В разделе
WizardData
нужно добавить информацию о всех используемых NuGet-пакетах:<WizardData> <packages repository="template"> <package id="zlib.net" version="1.0.3.0" /> <package id="MathNet.Numerics" version="2.1.2" /> <package id="MathNet.Numerics.FSharp" version="2.1.2" /> <package id="MSDN.FSharpChart.dll" version="0.60" /> <package id="HtmlAgilityPack" version="1.4.3" /> <package id="FSPowerPack.Community" version="2.1.1.1" /> </packages> </WizardData>
- Наконец, в самом файле проекта .fsproj, нужно убедиться, что используются относительные пути для NuGet-пакетов:
<PropertyGroup> ... <ReferencePath>..\packages\</ReferencePath> </PropertyGroup> ... <ItemGroup> <Compile Include="Program.fs" /> <None Include="packages.config" /> <None Include="FSharpChart.fsx" /> </ItemGroup> <ItemGroup> <Reference Include="FSharp.PowerPack"> <HintPath>..\packages\FSPowerPack.Community.2.1.1.1\Lib\Net40\FSharp.PowerPack.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="FSharp.PowerPack.Linq"> <HintPath>..\packages\FSPowerPack.Community.2.1.1.1\Lib\Net40\FSharp.PowerPack.Linq.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="FSharp.PowerPack.Metadata"> <HintPath>..\packages\FSPowerPack.Community.2.1.1.1\Lib\Net40\FSharp.PowerPack.Metadata.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="FSharp.PowerPack.Parallel.Seq"> <HintPath>..\packages\FSPowerPack.Community.2.1.1.1\Lib\Net40\FSharp.PowerPack.Parallel.Seq.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="HtmlAgilityPack"> <HintPath>..\packages\HtmlAgilityPack.1.4.3\lib\HtmlAgilityPack.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="mscorlib" /> <Reference Include="FSharp.Core" /> <Reference Include="System" /> ... <Reference Include="System.Xml" /> <Reference Include="System.Xml.Linq" /> <Reference Include="MathNet.Numerics"> <HintPath>..\packages\MathNet.Numerics.2.1.2\lib\Net40\MathNet.Numerics.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="MathNet.Numerics.FSharp"> <HintPath>..\packages\MathNet.Numerics.FSharp.2.1.2\lib\Net40\MathNet.Numerics.FSharp.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="MSDN.FSharpChart"> <HintPath>..\packages\MSDN.FSharpChart.dll.0.60\lib\MSDN.FSharpChart.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="zlib.net"> <HintPath>..\packages\zlib.net.1.0.3.0\lib\zlib.net.dll</HintPath> <Private>True</Private> </Reference> </ItemGroup>
Значение тега<Private>
—true
— значит, что все .dll будут скопированы в папку создаваемого с помощью шаблона проекта. - Чтобы добавить исправленные файлы обратно в .zip-архив, нужно использовать Windows Explorer — просто выделите и перетащите их на .zip файл. Я понятия не имею, почему не работает добавление с помощью WinRar'а, но я смог добиться успеха в сём предприятии только так.
- Осталось только перетащить исправленный .zip архив с шаблоном в папку
C:\Users\...\Documents\Visual Studio 2010\Templates\ProjectTemplates
, и новый шаблон появится в диалоге создания нового проекта.
После создания проекта запустите компиляцию, чтобы VS нашла все библиотеки. Alt+Enter поможет вам проверить работу шаблона:
FSharpChart.Point [| let gaussian = new Normal() for _ in 1..100 -> gaussian.Sample(), gaussian.Sample() |]
Комментариев нет:
Отправить комментарий