【问题标题】:Package Manager Console commands in pre-build event预构建事件中的包管理器控制台命令
【发布时间】:2012-06-02 09:15:29
【问题描述】:

本周早些时候,我发布了一个关于如何有效地share files amongst multiple web applications within a solution 的问题。 NuGet 是作为解决方案提供的,一段时间后我能够实施解决方案,但我有一个问题目前阻止我完成它。

此时我有两个 Web 应用程序项目:

  1. Project.Common.Presentations
  2. Project.Website.Presentations

每次构建Project.Common.Presentations 项目时,都会创建一个具有更高版本的新 NuGet 包。这个包用于我的主要网络项目Project.Website.Presentations。最初,我通过 GUI 将 project.common.presentations NuGet 包添加到该项目。在那之后,我设置了一个预构建,从命令行进行 NuGet 更新,以获取最新版本的 Project.Common.Presentations 包。

但不知何故,在命令行中使用 NuGet 更新会使用实际上不在磁盘上的位置添加对我的项目的引用,从而导致此问题:

无法解析此引用。找不到程序集“Project.Common.Presentations”。检查以确保该程序集存在于磁盘上。如果您的代码需要此引用,则可能会出现编译错误。

这是我设置结构的方式:

  • 我使用.csproj 文件为我的Project.Common.Presentations 项目生成了一个NuSpec 文件。
  • 在我的Project.Common.Presentations 中作为构建后事件,我使用:$(ProjectDir)nuget.exe pack -sym $(ProjectPath)。每次构建项目时,这都会构建一个新的 NuGet 包。在执行此构建事件之前,我使用脚本删除旧的 NuGet 包。
  • 作为我Project.Website.Presentations 中的预构建事件,我使用:$(ProjectDir)NuGet.exe update $(ProjectDir)packages.config

第一次重建全部运行,我的.csproj 文件更新为对我的包的 dll 引用,一切都很好。我第二次运行全部重建时,.csproj 文件再次更新,但它引用了具有较新版本软件包的不同文件夹,但该文件夹不知何故不在驱动器上。当我使用 GUI“管理 NuGet 包”更新 NuGet 包时,不会出现此问题,一切正常。

删除预构建事件并手动更新包可以正常工作。但是每次构建时都必须手动执行某些操作并不是我喜欢的。使用包管理器控制台卸载和安装包也可以正常工作。有没有办法将包管理器控制台操作合并到预构建事件中?提前感谢您提供的信息。

【问题讨论】:

  • 如果您发布了对您不起作用的预构建命令,将会很有帮助。
  • 有哪些常见的功能需要共享却不能放到库项目中?
  • @IrischChieftain:从长远来看,我想在不同的 Web 项目中创建功能应用程序组件,所以我想打包整个 Web 项目(母版页、aspx 页面、脚本等)并带来一切一起在主 Web 应用程序中。
  • 我认为这可以使用 NuGet 和库项目的组合来完成,而无需依赖构建脚本;看我的回答。
  • @JimCounts 我更新了我的帖子,提供了有关设置的更多详细信息。

标签: nuget nuget-package


【解决方案1】:

将 NuGet 用于此类事情的基本想法是在解决方案中的所有项目之间共享相对静态(很少更改)的工件。我个人使用 NuGet 还包含一个通用母版页 - 我的所有文件都放在 NuGet Content 文件夹中。

我所有的常用功能都放在库项目中,这样就不需要任何类型的构建脚本了。

参考:Multiple web applications projects within a visual studio solution

【讨论】:

  • 当只需要共享一个不经常更改的母版页时,我也会选择这种方法。但是如果我有一个项目有大约 10 个经常更改的 aspx 页面,我将如何跨项目共享这些页面? NuGet 仍然是一个有效的选择还是另一种方法更有效?
  • 因为我正在计划这个项目,所以还没有实际的页面。在我当前的所有项目中,将所有“正常”的东西放在我的 aspx 文件中(html 模板代码和对控件的引用等)。我将所有的 C# 代码都保存在后面的代码中。
  • 我没有看到需要跨 Web 项目共享页面的场景 - 常见的页面部分可以放在母版页中吗?您还可以选择用户控件。
  • 如果您想将应用程序拆分为逻辑组件,这些组件很可能有自己的 aspx 页面。在尝试了不同的方法之后,我不得不同意 NuGet 是迄今为止处理不定期更改的内容时的最佳方法。但是,当仍在积极开发中时,我更喜欢添加引用并使用构建后事件来复制任何未编译的文件(前端代码、aspx 页面前端、母版页前端)。 @IrishChieftain 感谢您为我的两个问题提供的所有帮助,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 2013-09-05
  • 2012-07-05
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多