我的项目使用名为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>
...
知道我的要求是否可行?
答案 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:
我们可以知道基于约定的工作目录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
文件,您将获得以下软件包:
然后将该软件包安装到您的项目中,当您构建项目时,Visual Studio将在开始构建之前在MyToolPackage.targets
文件中执行复制任务,wkhtmltopdf.exe将被复制到bin文件夹,当然,您可以将其复制到任何其他文件夹,只需更改DestinationFolder
文件中的MyToolPackage.targets
。
希望这会有所帮助。