C# 在VisualStudio中构建项目时如何安装Nuget软件包

C# 在VisualStudio中构建项目时如何安装Nuget软件包,c#,visual-studio,build,nuget,nuspec,C#,Visual Studio,Build,Nuget,Nuspec,我的项目使用一个名为wkhtmltopdf的可执行文件,它将HTML转换为pdf。我创建了一个NuGet包,它只需在项目的根目录中输出exe,就可以被我的应用程序引用和使用 如果我安装了nuget软件包,一切正常,这意味着可执行文件被添加到我的应用程序中,我可以使用它 问题是我不想提交可执行文件,但我希望如果另一个开发人员拆下我的项目并构建它,可执行文件也会添加到他的项目中(无需再次安装Nuget包) 我尝试只提交对包的引用 但它不起作用 .nuspec文件非常简单,只包含这一行(默认行除外)

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

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

问题是我不想提交可执行文件,但我希望如果另一个开发人员拆下我的项目并构建它,可执行文件也会添加到他的项目中(无需再次安装Nuget包)

我尝试只提交对包的引用

但它不起作用

.nuspec文件非常简单,只包含这一行(默认行除外)

。。。
...

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

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

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

你知道我的要求是否可行吗

出现此问题的原因是您将文件定位到.nuspec文件
target=“content\wkhtmltopf.exe”
中的
内容

根据:

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

当另一个开发人员拉下您的项目并构建它时,nuget将把这个包恢复到
\packages
文件夹中但是,NuGet不会修改您的项目,就像将该软件包下载到
\packages
文件夹一样,不会将该软件包安装到您的项目中

查看更多详细信息

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

要解决此问题,最简单的方法是在Package Manager控制台中使用NuGet命令行:

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

当然,您也可以从根本原因解决此问题,就像matt comment一样,将可执行文件定向到工具,如
target=“Tools\wkhtmltopf.exe”
,并将.targets文件目标添加到
\build
target=“build\NuGetPackageName.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>
打包此
.nuspec
文件,您将获得以下软件包:

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

希望这有帮助

你知道我的要求是否可行吗

出现此问题的原因是您将文件定位到.nuspec文件
target=“content\wkhtmltopf.exe”
中的
内容

根据:

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

当另一个开发人员拉下您的项目并构建它时,nuget将把这个包恢复到
\packages
文件夹中但是,NuGet不会修改您的项目,就像将该软件包下载到
\packages
文件夹一样,不会将该软件包安装到您的项目中

查看更多详细信息

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

要解决此问题,最简单的方法是在Package Manager控制台中使用NuGet命令行:

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

当然,您也可以从根本原因解决此问题,就像matt comment一样,将可执行文件定向到工具,如
target=“Tools\wkhtmltopf.exe”
,并将.targets文件目标添加到
\build
target=“build\NuGetPackageName.targets”
,以将可执行文件复制到项目文件中。如果你对此感兴趣,或者你对此有任何疑问,我想与你分享更多关于这方面的详细信息


更新:

现在,我将向您展示如何使用
工具
文件夹和
目标
文件执行此操作

这是我的
.n
<!--
***********************************************************************************************
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>