在Visual Studio中构建项目时如何安装Nuget包

时间:2018-07-17 21:18:07

标签: c# visual-studio build nuget nuspec

我的项目使用名为wkhtmltopdf的可执行文件,该可执行文件将HTML转换为pdf。我创建了一个NuGet包,该包仅将exe输出到项目的根目录中,以便我的应用程序可以引用和使用它。

如果我安装nuget软件包,则一切正常,这意味着可执行文件已添加到我的应用程序中,并且可以使用它。

问题是我不想提交可执行文件,但我希望如果另一个开发者拉下我的项目并进行构建,该可执行文件也将添加到他的项目中(而无需再次安装Nuget软件包)。

我尝试仅提交对包的引用

<package id="Wkhtmltopdf" version="0.12.5" targetFramework="net45">

但是没有用。

.nuspec文件非常简单,仅包含此行(默认行除外)

...   
<files>
    <file src="wkhtmltopdf.exe" target="Content\wkhtmltopdf.exe" />
</files>
...

知道我的要求是否可行?

2 个答案:

答案 0 :(得分:1)

是的,将对该程序包的引用添加到您的packages.config中,并在构建管道中启用NuGet程序包还原。如果您使用的是VSTS,则这是新型构建的构建管道中的一项特定任务。如果您使用的是Visual Studio,则它是首选项中的一个选项(工具->选项-> NuGet软件包管理器)。对于其他构建系统,您可以从命令行调用nuget restore

答案 1 :(得分:1)

  

知道我的要求是否可行?

此问题的原因是,您将文件定位到.nuspec文件content中的target="Content\wkhtmltopdf.exe"

根据From a convention-based working directory

enter image description here

我们可以知道基于约定的工作目录content中的文件:内容已复制到项目根目录。。它修改了项目文件。

当另一个开发人员下拉您的项目并进行构建时,nuget会将该软件包还原到\packages文件夹中。 但是,NuGet不会修改您的项目,就像将程序包下载到\packages文件夹一样,而不是将该程序包安装到您的项目中。

检查my previous thread了解更多详细信息。

这就是为什么您看到.nupkg和一个内容文件夹的原因,该文件夹的可执行文件位于\packages文件夹中,而不是项目文件文件夹中,而不是您想要的正确位置。< / p>

要解决此问题,最简单的方法是在程序包管理器控制台中使用NuGet命令行:

Update-Package -reinstall

在另一个开发人员下拉您的项目后,将软件包引用强制重新安装到项目中。

当然,您也可以从根本上解决此问题,就像无光注释一样,将可执行文件定位到工具,例如target="Tools\wkhtmltopdf.exe",并将.targets文件目标添加到\build target="Build\NuGetPackageName.targets",将可执行文件复制到您的项目文件中。如果您对此感兴趣或有任何问题,我想分享您的一些更多详细信息。


更新

现在,我向您展示如何使用Tools文件夹和.targets文件。

这是我的.nuspec文件:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyToolPackage</id>
    <version>1.0.0</version>
    <authors>Tester</authors>
    <owners>Tester</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2018</copyright>
    <tags>Tag1 Tag2</tags>
  </metadata>

  <files>
    <file src="wkhtmltopdf.exe" target="Tools\wkhtmltopdf.exe" />
    <file src="MyToolPackage.targets" target="Build\MyToolPackage.targets" />
  </files>

</package>

注意:.targets文件的名称应与软件包名称相同,例如,我的软件包名称为 MyToolPackage ,因此.targets的名称应为MyToolPackage.targets

MyToolPackage.targets文件的内容:

<!--
***********************************************************************************************
Copy the wkhtmltopdf.exe to the bin folder of project.
***********************************************************************************************
-->
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="CopyTool" BeforeTargets="Build">
    <Message Text="Copy tool to bin folder."></Message>
    <Copy
    SourceFiles="$(SolutionDir)packages\MyToolPackage.1.0.0\Tools\wkhtmltopdf.exe"
    DestinationFolder="$(ProjectDir)bin"
        />
  </Target>

</Project>

打包此.nuspec文件,您将获得以下软件包:

enter image description here

然后将该软件包安装到您的项目中,当您构建项目时,Visual Studio将在开始构建之前在MyToolPackage.targets文件中执行复制任务,wkhtmltopdf.exe将被复制到bin文件夹,当然,您可以将其复制到任何其他文件夹,只需更改DestinationFolder文件中的MyToolPackage.targets

希望这会有所帮助。