如何用本地构建临时替换 NuGet 引用

How to temporarily replace a NuGet reference with a local build

我正在使用 Visual Studio 2015 开发一个 C# 项目,使用 NuGet 进行包管理。作为参考,我想在迭代修复时暂时使用本地构建,而不是发布版本。实现此目标的最佳方法是什么?

如果我使用的是外部 SVN,我会将本地构建的新副本放入外部引用的文件夹中,然后进行设置。其他包管理软件(如 CocoaPods)允许我指向本地目录来解析引用。使用 NuGet,看起来没有任何机制。

当我尝试将我的新 DLL 放到 packages 文件夹中的包引用上时,我在 Visual Studio 中出现不一致的行为。我的构建将因数百个错误而失败,其中大部分很快就会从错误列表中消失。我最终留下了一条警告,告诉我它无法解析对我要替换的程序集的引用(尽管引用的属性确实表明它正在寻找我的新版本)。

您可以创建自己的 Nuget 提要(简单的本地文件夹 + 一些配置)

在此处阅读更多内容Hosting Your Own NuGet Feeds

我发现以下解决方法对我有用:

首先,我从解决方案的上下文菜单中禁用“NuGet 包还原”。

之后,我进入 %HOMEPATH%\.nuget\packages 文件夹,搜索我要替换的包。我从这个包中获取版本号,并使用这个确切的版本号来构建我想要交换的 dll。

之后我可以将packages文件夹中的dll与这个新建的dll交换。现在构建项目使用这个新的 dll。

设置一次后,我可以轻松构建新的 dll,并将它们复制到 packages 文件夹中。

我们使用此工具取得了巨大的成功。它易于使用和工作。

对比 2019 https://marketplace.visualstudio.com/items?itemName=RicoSuter.NuGetReferenceSwitcherforVisualStudio2019

对比 2017 https://marketplace.visualstudio.com/items?itemName=RicoSuter.NuGetReferenceSwitcherforVisualStudio2017

对比 2015 https://marketplace.visualstudio.com/items?itemName=RicoSuter.NuGetReferenceSwitcherforVisualStudio2015

在 VS2019 中,这是您可以有条件地在项目引用和包引用之间切换构建的方法。我们将其用于 docker 个容器

  1. 打开项目解决方案“Solutions\Bookstore\Bookstore.sln”,其中包含将引用 nuget

    的项目“Bookstore.csproj”
  2. 添加一个解决方案文件夹,例如“nuget”并添加现有项目“Solutions\Library\library.csproj”

  3. 将条件项组添加到项目文件“Bookstore.csproj”

    <ItemGroup Condition="Exists('..\..\Library\library.csproj')">
      <ProjectReference Include="..\..\Library\library.csproj" />
    </ItemGroup>
    <ItemGroup Condition="!Exists('..\..\Library\library.csproj')">
      <PackageReference Include="library" Version="1.0.0" />
    </ItemGroup>
    
  4. 在解决方案资源管理器中,右键单击 Bookstore 解决方案 > 属性 > 配置属性。对于配置 'Release',取消选中项目 'library.csproj'。现在,当您的代码在调试中构建时,它将构建项目引用。当它在发行版中构建时,它不会尝试构建它。

  5. 我们发布时请务必使用 'Release'。这是有效的,因为当您发布时,它将无法从我们在 Bookstore.csproj“..\..\Library\library.csproj”中配置的路径中找到“Solutions\Library\library.csproj”。

  6. 你不必使用 docker 来工作,但这里作为一个例子 是我们的 docker 文件将要 运行

    的命令
    WORKDIR "/Solutions/Bookstore"
    RUN dotnet restore
    RUN dotnet build -c Release -o /app
    FROM build AS publish
    RUN dotnet publish "Bookstore.csproj" -c Release -o /app
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app .
    

DNT (DotNetTools) 是最新的并且具有从包切换到本地项目引用并再次返回的命令。

dnt switch-to-projects

dnt switch to packages

https://github.com/RicoSuter/DNT#switch-to-projects