在Azure DevOps构建管道中还原Libman JS库

时间:2020-01-14 14:05:09

标签: c# azure .net-core azure-devops libman

我已经建立了一个愉快的Azure DevOps构建管道,该管道在提交分支时触发,然后还原Nuget程序包,构建我的Mvc.Core Web应用并将其部署到Azure应用服务。

但是,不会还原LibMan中引用的JS库并将其部署到Azure。我如何做到这一点?

我包含了LibMan构建软件包(我读过would carry out the task automatically),但并不高兴。

<PackageReference Include="Microsoft.Web.LibraryManager.Build" Version="2.0.96" />    

我真的需要在管道中添加.net核心自定义命令到install the LibraryManager Cli tool,然后再将其调用到restore the JS libraries吗?似乎比我预期的要复杂,而且我还没有找到任何在线进行此操作的示例。

将JS库包含在源代码控制中的另一种方法是吗?我确实想避免这种情况,但是,如果这是标准方法,那么我很乐意做到这一点。

非常感谢在Azure DevOps中实现此目标的任何建议或YAML示例。

2 个答案:

答案 0 :(得分:3)

在我们的案例中,恢复LibMan JS库的问题原来是几个月前另一位开发人员添加的项目文件设置,当时他们遇到了构建速度慢的问题as mentioned here

 <PropertyGroup>
    <LibraryRestore>false</LibraryRestore>
  </PropertyGroup>

一旦找到并删除了此设置,毫无疑问,LibMan还原可以完美地工作,并且构建时间也不会特别慢。

我想理想的情况是不要尝试在每个构建上都进行LibMan还原,而是在开发人员机器上手动进行,然后作为DevOps构建管道中的特定步骤?但是无论如何,现在一切正常。

答案 1 :(得分:2)

在Azure DevOps构建管道中还原Libman JS库

您无需向管道添加.net core自定义命令即可还原JS库。

我已经创建了一个示例来测试LibMan构建软件包,并且在Azure devops上运行良好。

要使用LibMan构建软件包,首先,需要在项目中使用JS库设置正确的libman.json,例如:

{
  "version": "1.0",
  "defaultProvider": "cdnjs",
  "libraries": [
    {
      "provider": "cdnjs",
      "library": "jquery@3.2.1",
      "destination": "wwwroot/lib/jquery",
      "files": [
        "jquery.min.js",
        "jquery.js",
        "jquery.min.map"
      ]


    }
  ]
}

那是因为LibMan软件包将基于libman.json恢复JS库。您可以在microsoft.web.librarymanager.build.targets构建包中的LibMan中找到以下目标:

<Target Name="LibraryManagerRestore" Condition="'$(LibraryRestore)' != 'False'">

    <Microsoft.Web.LibraryManager.Build.RestoreTask
        FileName="libman.json"
        ProjectDirectory="$(MSBuildProjectDirectory)"
        ProviderAssemblies="$(LibraryProviderAssemblies)">

        <Output TaskParameter="FilesWritten" ItemName="_FilesWritten"/>
    </Microsoft.Web.LibraryManager.Build.RestoreTask>

    <ItemGroup>
        <FilesForPackagingFromProject  Include="%(_FilesWritten.Identity)">
            <DestinationRelativePath>%(_FilesWritten.Identity)</DestinationRelativePath>
        </FilesForPackagingFromProject>
    </ItemGroup>
</Target>

此.targets仅在构建期间由MSBuild解析,

因此,第二,当您构建项目而不是还原软件包时,将还原那些JS库。

作为测试,我从仓库中删除了JS libraries

enter image description here

然后在dotnet构建完成之后,我可以在文件夹JS libraries中获得wwwroot/lib/jquery

enter image description here

如果仍然无法解决问题,请确保在不使用Azure Devops的情况下从Visual Studio生成时可以还原JS库。

顺便说一句,您还可以使用任务Libman(预览)代替MSBuild来恢复libman.json中定义的软件包。

希望这会有所帮助。