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

How install Nuget package when building project in Visual Studio

我的项目使用一个名为 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>
...

知道我的问题是否可行吗?

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

Any idea if what I'm asking is possible?

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

根据 From a convention-based working directory:

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

当另一个开发人员下载您的项目并构建它时,nuget 会将此包恢复到 \packages 文件夹。 但是, NuGet 不会修改您的项目,它只是将该包下载到 \packages 文件夹而不是将此包安装到您的项目。

查看 了解更多详情。

这就是为什么您在 \packages 文件夹中看到 .nupkg 和包含可执行文件的内容文件夹而不是在项目文件夹中的原因,这不是您想要的正确位置.

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

Update-Package -reinstall

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

当然,你也可以从根本上解决这个问题,就像matt comment一样,把你的可执行文件定位到工具,比如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文件,你会得到以下包:

然后将这个包安装到你的项目中,当你构建你的项目时,Visual Studio会在构建开始前执行MyToolPackage.targets文件中的复制任务,wkhtmltopdf.exe会复制到bin文件夹,当然也可以复制到其他文件夹,只需要将MyToolPackage.targets文件中的DestinationFolder改成

即可

希望这对您有所帮助。