________fear_of_underscores

среда, 20 июня 2012 г.

MS Visual Studio Template for Data Analysis

Уже довольно давно я пользуюсь няшным шаблоном для VS, который помогает в пару кликов мышки создать проект F#, в котором легко можно делать матричные операции с помощью Math.Net Numerics, использовать HtmlAgilityPack и рисовать графики с помощью FSharpChart:


Я сделал этот шаблон, когда понял, что если ещё один раз буду вручную добавлять все нужные библиотеки — повешусь. Тем не менее, сам процесс создания шаблона не обошёлся без пары gotchas, так что я решил записать его; сейчас же перепишу его сюда и приложу сам шаблон, на благо общественности.

В шаблоне используются библиотеки, добытые с помощью NuGet'a и скрипт FSharpChart. Все права на всё принадлежат тем, кому они принадлежат ^_^.

АлгоритмЪ:
  1. Создать обычный проект 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
    
  2. File > Export Template...
  3. Получится .zip файл, в корневую папку которого надо вставить все .nupkg файлы:
  4. В файле 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>
    
  5. В разделе 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>
    
  6. Наконец, в самом файле проекта .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 будут скопированы в папку создаваемого с помощью шаблона проекта.
  7. Чтобы добавить исправленные файлы обратно в .zip-архив, нужно использовать Windows Explorer — просто выделите и перетащите их на .zip файл. Я понятия не имею, почему не работает добавление с помощью WinRar'а, но я смог добиться успеха в сём предприятии только так.
  8. Осталось только перетащить исправленный .zip архив с шаблоном в папку C:\Users\...\Documents\Visual Studio 2010\Templates\ProjectTemplates, и новый шаблон появится в диалоге создания нового проекта.
Ну и, как и было обещано, сам шаблон (или на github'e).
После создания проекта запустите компиляцию, чтобы VS нашла все библиотеки. Alt+Enter поможет вам проверить работу шаблона:
FSharpChart.Point
    [|
        let gaussian = new Normal()        
        for _ in 1..100 -> gaussian.Sample(), gaussian.Sample() |]

Комментариев нет:

Отправить комментарий