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

时间:2015-09-09 14:47:20

标签: c# nuget

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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

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

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

答案 1 :(得分:6)

答案 2 :(得分:3)

在 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 解决方案 > 属性 > 配置属性。对于配置“发布”,取消选中项目“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 .
    

答案 3 :(得分:2)

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

dnt switch-to-projects

dnt switch to packages

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