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

Dov*_*Dov 16 c# nuget

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

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

当我尝试将新的DLL放在packages文件夹中的包引用上时,我在Visual Studio中得到了不一致的行为.我的构建将失败,有数百个错误,其中大多数错误很快就会从错误列表中消失.我最后留下了一个警告,告诉我它无法解析我正在尝试替换的程序集的引用(虽然引用的属性确实表明它正在找到我的新版本).

C R*_*lph 15

在 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>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在解决方案资源管理器中,右键单击 Bookstore 解决方案 > 属性 > 配置属性。对于配置“Release”,取消选中项目“library.csproj”。现在,当您的代码在调试中构建时,它将构建项目引用。当它构建在发行版中时,它不会尝试构建它。

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

  6. 您不必使用 docker 即可完成此操作,但作为示例,这里是我们的 dockerfile 将运行的命令

    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 .
    
    Run Code Online (Sandbox Code Playgroud)


Mat*_*ias 10

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

首先,我从解决方案的上下文菜单中禁用"NuGet Package Restore".

之后我转到packages文件夹,搜索我要替换的包.从这个包中我得到版本号,并使用这个确切的版本号来构建我想要交换的DLL.

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

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

  • 禁用"NuGet包恢复"是没有必要的 (2认同)

Fra*_*nia 7

我们使用这个工具取得了很大的成功.它易于使用和工作.

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

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

  • 不幸的是,这似乎不再支持较新的项目文件。 (2认同)

Jas*_*per 6

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

在此处阅读更多内容托管自己的NuGet提要

  • 除了从旧的卸载然后重新安装之外,有没有办法切换到本地文件夹包源?这不是那么简单,因为在我正在处理的解决方案中有 20 个项目,其中只有 5 个使用该库。这不是不可逾越的,而是烦人的。 (4认同)
  • 你有没有找到一个好的解决方案?我们的团队正在处理多个项目,并在 Azure DevOps 中拥有一个构建管道。如果能够在本地开发和使用这些库,然后让 DevOps 构建代理使用来自 Nuget feed 的构建工件,那就太好了。 (3认同)

Kev*_*ins 6

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

dnt switch-to-projects

dnt switch to packages

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


lon*_*nix 6

.csproj在项目文件中:

<ItemGroup Condition="'$(Configuration)'=='Debug'">
  <ProjectReference Include="../../../Library1/Library1.csproj" />
  <ProjectReference Include="../../../Library2/Library2.csproj" />
</ItemGroup>
<ItemGroup Condition="'$(Configuration)'!='Debug'">
  <PackageReference Include="Library1" Version="1.0.0" />
  <PackageReference Include="Library2" Version="1.0.0" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

开发中:项目在调试模式下编译,因此将使用项目引用。

在生产环境中(CI 服务器、docker 容器):项目以发布模式编译,因此将使用包引用。