ProjectCracker с проектами .netstandard 2.0 - PullRequest
0 голосов
/ 20 декабря 2018

Моя команда недавно перешла от использования .net framework для использования .net standard 2.0 для наших библиотек F #.У нас есть несколько внутренних сценариев, которые мы выполняем в наших проектах для автоматического создания документации по уценке, и эти сценарии используют SDK F # Compiler Services для анализа кода и получения метаданных типа, комментариев к документации и т. Д.

Мы используембиблиотека FSharp.Compiler.Service.ProjectCracker для чтения наших файлов .fsproj и создания экземпляра FSharpProjectOptions для использования при запуске метода FSharpChecker.ParseAndCheckFileInProject.Однако при работе со стандартными проектами .net мы получаем следующую ошибку при вызове ProjectCracker.GetProjectOptionsFromProjectFile:

System.Exception: Could not load project Example.fsproj in ProjectCollection. 
Available tools: 
["C:\Program Files (x86)\MSBuild\12.0\bin\amd64";
 "C:\Program Files (x86)\MSBuild\14.0\bin\amd64";
 "C:\Windows\Microsoft.NET\Framework64\v2.0.50727";
 "C:\Windows\Microsoft.NET\Framework64\v3.5";
 "C:\Windows\Microsoft.NET\Framework64\v4.0.30319"]. 

Message: The default XML namespace of the project must be the MSBuild XML namespace. 
If the project is authored in the MSBuild 2003 format, please add xmlns="http://schemas.microsoft.com/developer/msbuild/2003" to the <Project> element. 
If the project has been authored in the old 1.0 or 1.2 format, please convert it to MSBuild 2003 format.```

. Есть ли способ чтения стандартных файлов проекта .net с использованием библиотеки Project Cracker, или нам потребуетсявручную проанализировать файл и вручную создать FSharpProjectOptions для наших новых библиотек?

1 Ответ

0 голосов
/ 21 декабря 2018

Похоже, что стандартный пакет ProjectCracker нельзя использовать для чтения файлов проекта .netstandard.Однако уже имеется пакет NuGet для этой функции, Dotnet.ProjInfo .Этот проект позволяет читать все варианты файлов проекта .NET, включая .NET Framework и .NET Core, а также файлы project.json и .csproj / .fsproj.

Проект не являетсяочень хорошо документирован как API (документация лучше для инструмента командной строки), но его программное использование можно увидеть в библиотеке FsAutoComplete .

Для проекта .netstandard вы можете использовать функцию getProjectInfos, например:

let getProjectInfo additionalMSBuildProps file =
    let projDir = Path.GetDirectoryName file
    let additionalInfo = 
            [ "OutputType"
              "IsTestProject"
              "Configuration"
              "IsPackable"
              MSBuildKnownProperties.TargetFramework
              "TargetFrameworkIdentifier"
              "TargetFrameworkVersion"
              "MSBuildAllProjects"
              "ProjectAssetsFile"
              "RestoreSuccess"
              "Configurations"
              "TargetFrameworks"
              "RunArguments"
              "RunCommand"
              "IsPublishable"
            ]

    let loggedMessages = System.Collections.Concurrent.ConcurrentQueue<string>()
    let msBuildExec = Dotnet.ProjInfo.Inspect.msbuild (Dotnet.ProjInfo.Inspect.MSBuildExePath.DotnetMsbuild "dotnet") (fun exePath args -> Utils.runProcess loggedMessages.Enqueue projDir exePath (args |> String.concat " "))
    let gp () = Dotnet.ProjInfo.Inspect.getProperties (["TargetPath"; "IsCrossTargetingBuild"; "TargetFrameworks"] @ additionalInfo)

    let additionalArgs = additionalMSBuildProps |> List.map (Dotnet.ProjInfo.Inspect.MSBuild.MSbuildCli.Property)

    let cliList = [Dotnet.ProjInfo.Inspect.getFscArgs; Dotnet.ProjInfo.Inspect.getResolvedP2PRefs; gp]

    file |> Dotnet.ProjInfo.Inspect.getProjectInfos loggedMessages.Enqueue msBuildExec cliList additionalArgs
...