11

我们有一个我们正在开发的 ASP.NET MVC 5 项目,它依赖于来自不同解决方案的项目。另一个解决方案是常见的类库,我们作为 NuGet 包发布。当我们发布时,我们编译项目并从 NuGet 存储库中获取它,但是当我们正在开发中时,我们从该项目的 bin 文件夹中获取引用。

为了让它工作,我们对 ASP.NET 项目的 csproj 文件执行了以下“hack”(我们手动编辑了 csproj xml 文件并更改了引用):

<Reference Include="Common.Utilities, Culture=neutral, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath Condition=" '$(Configuration)' == 'Debug' ">..\..\..\Common\Common.Utilities\bin\$(Configuration)\Common.Utilities.dll</HintPath>
    <HintPath Condition=" '$(Configuration)' != 'Debug' ">..\..\..\..\ExtrnBin\NuGetPackages\Common.Utilities.1.0.0.8\lib\net451\Common.Utilities.dll</HintPath>
</Reference>

因此,当我们编译调试时,它从类库项目文件夹中获取,而当我们编译发布时,它从下载的 NuGet 中获取。这对于快速开发非常有用,因为我们不必为每次更改都重新发布新的 NuGet。

我们现在正在测试 ASP.NET 5,依赖关系不再定义在csproj文件中,而是在project.json文件中。因此,如果我们添加一个引用,我们会得到如下内容project.json

"dependencies": {
    "EntityFramework.Commands": "7.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
    "Microsoft.ApplicationInsights.AspNet": "1.0.0-rc1",
    "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
    "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
    "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final",
    "Common.Utilities": "1.0.0.8-*"
}

它还创建一个包装文件夹并将 DLL 复制到lib\dnx\451文件夹。

我们如何设置类似于我们之前的东西来支持 2 个构建配置?

4

1 回答 1

1

简短的回答

您无法避免重新发布;但是,您可以避免远程重新发布。

在每次构建类库解决方案时,将 NuGet 包发布到本地目录,例如C:\LocalPackages. 在您的 MVC 项目中,使用两种不同的 NuGet 包源:一种用于发布,另一种用于调试。制作调试源C:\LocalPackages

调试将从本地 NuGet 源获取,发布将从下载的 NuGet 获取。

来自 ASP.NET Core 存储库的示例

ASP.NET MVC 存储库packageSources对不同的构建使用不同的。您的问题的一个答案是使用相同的方法,但使用本地packageSources开发版本。

aspnetrelease分支 > nuget.config

<packageSources>
  <clear />
  <add key="AspNetVNext" value="https://www.myget.org/f/aspnetmaster/api/v3/index.json" />
  <add key="NuGet" value="https://api.nuget.org/v3/index.json" />
</packageSources>

aspnetdev分支 > nuget.config

<packageSources>
  <add key="AspNetVNext" value="https://www.myget.org/F/aspnetcidev/api/v3/index.json" />
  <add key="NuGet" value="https://api.nuget.org/v3/index.json" />
</packageSources>

本地快速开发的工作流程

这是我们使用的工作流程的近似值。这足以让您入门。

在构建时生成 NuGet 包

在 Visual Studio 2015 中,创建一个新的Class Library (Package). 将其配置为在构建时将包发布到本地目录。换句话说...

  1. 右键单击项目。
  2. 选择属性。
  3. 在“构建”选项卡中,选择“在构建时生成输出”。

现在,每个构建都将类库作为 NuGet 包输出到解决方案的artifacts目录。

在构建时自动将 NuGet 包发布到本地目录

要在单个本地 NuGet 源中访问我们的所有包,请将以下postpack脚本添加到类库的project.json. 该脚本将包复制到我们的本地 NuGet 源目录。该/y选项会覆盖现有文件。

项目.json

"scripts": {
  "postpack": 
    "xcopy /y ..\\..\\artifacts\\bin\\%project:Name%\\Debug\\*.nupkg C:\\LocalPackages\\"
}

请参阅复制调试和/或发布包的备用脚本的备注。

将 MVC 项目配置为使用本地 NuGet 目录

打开位于单独解决方案中的 MVC 项目。有关在不修改全局 NuGet 设置的情况下指定解决方案包的方法,请参阅备注。

  1. 选择工具 > NuGet 包管理器 > 包管理器设置
  2. 单击包源。
  3. 添加一个名为LocalPackages.
  4. 将其源设置为C:\LocalPackages.
  5. 单击更新。

准备好发布时,将LocalPackages条目替换为适当的 NuGet 源以进行生产。

指向本地包

将本地 NuGet 包添加到您的项目

从 MVC 项目中,访问本地 NuGet 包。

  1. 选择工具 > NuGet 包管理器 > 管理解决方案的 NuGet 包
  2. 将包源设置为LocalPackages.
  3. 选择浏览选项卡。
  4. 安装本地软件包。

使用本地包

评论

(1) 要在我们的项目中同时使用 Debug 和 Release 包,请使用以下postpack脚本。

for /r "..\\" %i in (*.nupkg) do xcopy /y %i C:\LocalPackages`

(2) Visual Studio 将 NuGet 包源添加到~\AppData\Roaming\NuGet\nuget.config文件中。nuget.config或者,在我们解决方案的根目录中创建一个。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="LocalPackages" value="C:\LocalPackages" />
  </packageSources>
</configuration>
于 2016-03-29T22:33:53.733 回答