【问题标题】:How to NuGet install in .nuget folder when compiling locally本地编译时如何在 .nuget 文件夹中安装 NuGet
【发布时间】:2019-09-04 14:56:25
【问题描述】:

我有两个 .Net 项目:

  • 一个项目是一个包含一些DTO的.Net标准项目;称之为“核心库”。这旨在作为 NuGet 包发布
  • 另一个是.Net框架项目,包含核心库的NuGet包。称之为“应用”

使用 TFS,我们能够编译核心库,发布生成的 NuGet 库,然后启动应用程序的构建,恢复 NuGet 对核心库的引用。一切正常。

问题是在开发核心库+应用程序时,我们经常编译核心,不能等待整个核心库构建完成才能更新应用程序的本地引用。此外,我们必须推送核心库的完整提交(因此我们不能在应用程序中测试它们之前同时推送一个 DTO)。

所以我想知道 Visual Studio 和 Nuget 中是否存在一种在本地用户的 .nuget 文件夹中发布/安装核心 Nuget 库的方法,以便在下一次构建时自动对应用程序的项目可见。

你能帮我解决这个问题吗?

【问题讨论】:

  • 如果两个项目都是本地构建的,为什么不使用方便的项目引用呢?如果您希望 nuget 包对应用程序的项目自动可见,您可以按照 mm8 的建议将 nuget 包放置在 nuget.config 中定义的任何包源路径中。您也可以通过 UI 执行此操作,在 VS IDE 中,转到 Tools=>nuget package manager=>package manager settings 添加新的包源,它可以是本地文件夹,如 C:\CustomPackages,然后是此文件夹中的任何 nuget 包应用程序的nuget package manager UI 可以看到。 (也可以设置路径为本地缓存C:\xxx\.nuget\packages)。
  • 我的问题是将nuget push 命令自动化到本地提要,在我的情况下应该是%userprofile%\.nuget\packages。我不能要求公司中的任何人手动将核心包复制到本地提要以查看链接应用程序中的更改
  • 也许你想做的类似于what this user do?每次成功构建核心库项目后,运行构建后事件或目标以自动执行 nuget push 命令。
  • 嗨,这个问题有什么更新吗?或者我误解了你的最后评论:(
  • 对不起,我以为我回答了你的问题!

标签: c# visual-studio nuget nuget-package-restore


【解决方案1】:

Lance Li-MSFT的回答开始,我根据自己的需要做了一些改动。事实上,在本地我没有安装nuget.exe,而只安装了.Net Core 运行时,所以我使用dotnet pack 命令而不是nuget.exe packdotnet nuget push 而不是nuget.exe push。此外,在本地推送更新的 NuGet 包之前,我删除了具有相同版本的旧包,否则 dotnet nuget push will not overwrite 包。

我接受 Lance Li-MSFT 的回答,因为它是我解决方案的起点,适用于在本地拥有 nuget.exe 的用户。

我的解决方案如下

corelib.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>

  <Target Name="PublishNuGetLocally" AfterTargets="Build">
    <Exec Command="dotnet pack $(ProjectPath)"/>
    <Exec Command="dotnet nuget delete --source $(UserProfile)\.nuget\packages $(PackageId) $(PackageVersion) --non-interactive" ContinueOnError="WarnAndContinue"/>
    <Exec Command="dotnet nuget push --source $(UserProfile)\.nuget\packages $(ProjectDir)bin\$(ConfigurationName)\$(PackageId).$(PackageVersion).nupkg" />
  </Target>
  [...]

</Project>

附带说明,我不必在 Visual Studio 中配置包源,因为全局 Nuget 缓存(在路径 %UserProfile%\.nuget\packagesis automatically used 是搜索 NuGet 包的第一个位置。

【讨论】:

    【解决方案2】:

    所以我想知道 Visual Studio 和 Nuget 中是否存在一种方法 在本地用户的 .nuget 中发布/安装核心的 Nuget 库 文件夹以使其可见。

    在将nuget包(nuget push)发布到本地某​​个位置之前,我们应该添加路径作为包源。所以我们需要先将本地包的路径设置为包源。 nuget.config文件中的内容对应VS中的Package Source UI,有两种方法。

    1.在VS中,进入Tools=&gt;nuget package manager=&gt;package manager settings=&gt;package source,点击绿色按钮定义新的包源。

    2.或者我们可以找到当前用户的nuget.config文件,见this document。 #1 中的 UI 操作实际上有助于在 C:\Users\xxx\AppData\Roaming\NuGet 中定义 nuget.config 文件中的源,请参阅:

    所以我们可以直接编辑这个文件来设置我们新的包源,然后保存文件并重新启动VS,我们可以在UI中看到新定义的源。

    我的问题是将 nuget push 命令自动化到本地提要, 在我的情况下应该是 %userprofile%.nuget\packages。我不能问 公司内任何人手动将核心包复制到 本地供稿以查看链接应用程序中的更改

    将本地提要添加到包源后,您可以使用nuget push 命令将包发布到提要。

    您可以在您的核心库项目文件(xx.csproj)中定义一个类似这样的自定义目标来自动打包和自动推送包:

      <Target Name="CustomTarget" AfterTargets="build">
        <Exec Command="nuget.exe pack xx.csproj"/>
        <Exec Command="nuget.exe push -source xxx path\xxx.nupkg"/>
      </Target>
    

    您还可以将Conditions 添加到此目标&lt;Target Name="CustomTarget" AfterTargets="build" Condition="$(Configuration)=='Debug'"&gt;。您可以控制 VS 应该在哪个配置中运行此目标来为您打包和推送。

    另外:

    对于.net core 库项目,VS 有创建选项。 nuget 包。您可以在VS中右键单击该项目并选择Pack按钮。因此您也可以为该项目定义一个.bat文件来执行nuget push。过程是构建项目=>使用pack选项轻松获取nuget包=>运行.bat自动推送。

    希望对你有帮助。

    【讨论】:

    猜你喜欢
    • 2012-05-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多