在 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
改成
即可
希望这对您有所帮助。
我的项目使用一个名为 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
改成
希望这对您有所帮助。