【问题标题】:How install Nuget package when building project in Visual Studio在 Visual Studio 中构建项目时如何安装 Nuget 包
【发布时间】:2018-12-25 16:24:46
【问题描述】:

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

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

【问题讨论】:

    标签: c# visual-studio build nuget nuspec


    【解决方案1】:

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

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

    根据From a convention-based working directory

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

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

    查看my previous thread了解更多详情。

    这就是为什么您会在 \packages 文件夹中看到 .nupkg 和带有可执行文件的 Content 文件夹,而不是在项目文件夹中,这不是您想要的正确位置。

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

    Update-Package -reinstall
    

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

    当然,你也可以从根本上解决这个问题,就像matt注释一样,将你的可执行文件定位到Tools,比如target="Tools\wkhtmltopdf.exe",并将.targets文件目标添加到\buildtarget="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即可。

    希望这会有所帮助。

    【讨论】:

    • 感谢您分享您的答案。对不起,但我有点困惑。我不完全了解 Tools 和 Build 文件夹的工作原理。我应该使用哪一个?安装软件包后,如何从我的项目中引用 .exe?就像单挑一样。我之前的 nuspec 目标是 &lt;file src="wkhtmltopdf.exe" target="Content\bin\wkhtmltopdf.exe" /&gt;,它将 .exe 添加到 bin 文件夹,但重建项目会删除可执行文件。
    • 所以,在 guide 之后,我创建了这个 .nuspec 文件 ...&lt;file src="build**" target="build"&gt;...,可执行文件在路径 build\net462\wkhtmltopdf.props\wkhtmltopdf.exe 下。现在我面临两个问题:首先,在 Visual Studio 中安装包时出现错误:“[..] 包不包含任何与该框架兼容的程序集引用或内容文件 [...]”。第二,即使这项工作我将如何在我的项目中引用 .exe?
    • @Sergio,我已经为您提供了解决此问题的详细步骤,请查看我的更新答案。如果您有任何其他问题,请告诉我。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,但该选项已启用。发生的事情是这样的:如果我去 myProject/packages/wkhtmltopdf 我可以看到 .nupkg 和一个包含可执行文件的 Content 文件夹。但这不是我在 nuspec 中指定的文件夹。当我使用 nuget 管理器安装 nuget 时,可执行文件被添加到正确的位置。
    • 您可能想查看工具包。您可以添加一个 .targets 文件,该文件可以将文件复制到 bin 文件夹或类似文件夹。然而,听起来确实像包还原正在做它应该做的并将东西添加到“包”文件夹中。
    • 是的,包还原正在完成这项工作,但我想从根本上解决问题。更准确地说,考虑使用 TeamCity 的 CI 配置。我已经设置了一个构建步骤来使用 Nuget Installer 运行器类型恢复 nuget 包。我希望在此步骤中将内容添加到我的根项目中。我也想弄清楚我是否可以在构建期间运行Update-package "packageId" 命令,但我不认为这是它的工作方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多