在带有 Web 部署项目的 ASP.NET“网站”项目中将 NuGet 与 *.dll.refresh 文件结合使用

问题描述 投票:0回答:4

如果您有 ASP.NET 网站项目类型(没有正确的 .csproj 或 .vpproj 项目文件,只是一个松散文件的文件夹),那么当您使用 NuGet 添加包时,它会生成一个 *. Bin 目录中的 dll.refresh 文件以引用父包文件夹中的包的 dll。

例如,如果您从程序包管理器控制台执行“install-package elmah”,则 Elmah 将被放置在项目解决方案目录的 packages 文件夹中,并且文件 Elmah.dll.refresh 将被放置在项目的 Bin 文件夹中。

当我在本地构建项目时,Visual Studio 会自动拉入刷新文件引用的 DLL。该网站和 Elmah 运行正常。我没有将项目 Bin 目录中的 Elmah.dll 文件签入源代码管理(仅签入刷新文件和包文件夹)。

但是,我正在使用 Web 部署项目来预编译站点并为部署执行 web.config 替换。当以这种方式构建解决方案时,Elmah.dll 不会自动拉入网站项目 Bin 目录,并且由于缺少 DLL,网站无法正常运行。

NuGet 打算如何用于这种场景?我应该检查 Bin 目录中的 Elmah.dll 吗?

asp.net web-deployment-project nuget build-server
4个回答
11
投票

这是基于上面GC的解决方案。 添加类库 (csproj) 并在网站项目中引用该类库。 将 nuget 包添加到类库中。 在类库中,实际上引用了某个类文件中的nuget包。也许创建一个一次性实例或其他东西。您可以使用包中包含的任何类。这会强制将 .dll 复制到网站项目中的 Bin 目录。


5
投票

-- 编辑 -- 请参阅上面此解决方案的更新版本。

只需将类库项目添加到解决方案中,并将对该类库项目的引用添加到您的网站即可。

然后,在类库中添加nuget,而不是网站项目。

当您的网站构建时,它会依次拉入所有类库的依赖项。


0
投票

我猜测预编译不会使用 .refresh 文件更新 DLL - 也许这是由 Visual Studio 完成的。

如果您找不到方法来做到这一点,您可以创建一个构建步骤,手动将 DLL 复制到 bin 文件夹中,或者如果您试图避免 DLL 的两个副本,也许您可以签入 bin文件夹而不是包文件夹。您可以使用 NuGet.exe 重新获取包,填充包文件夹(请参阅此处此处


0
投票

我在 Visual Studio 2019 上运行 ASP.NET Web 表单时遇到了同样的问题。 我的解决方案是从本地目录刷新包,但也可以直接从在线服务器恢复。

在记事本中创建一个新文件

方法1:从NuGet恢复

文件名:TheDescription.refresh

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="TheDescription" version="0.0.0.00" />
</packages>

方法二:本地包目录的相对路径

文件名:TheDescription.dll.refresh

..\packages\TheDescription.0.0.0.0\lib\net40\TheDescription.dll

将该文件添加到 Visual Studio 中项目的 bin 目录中,并包含在源代码管理中(如果您使用的话)。

编译工程,确认文件正确刷新。

© www.soinside.com 2019 - 2024. All rights reserved.