我们正在开发一个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种构建配置的东西?
答案 0 :(得分:1)
你无法避免重新发布;但是,您可以避免远程重新发布。
在类库解决方案的每个版本上,将NuGet包发布到本地目录,例如C:\LocalPackages
。在您的MVC项目中,使用两个不同的NuGet包源:一个用于发布,另一个用于调试。制作调试源C:\LocalPackages
。
Debug将从本地NuGet源获取,发布将从下载的NuGet中获取。
ASP.NET MVC repository对不同版本使用不同的packageSources
。您的问题的一个答案是使用相同的方法,但使用本地packageSources
进行开发构建。
aspnet release
分支&gt; 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>
aspnet dev
分支&gt; 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>
以下是我们使用的工作流程的近似值。这足以让你开始。
在Visual Studio 2015中,创建一个新的Class Library (Package)
。将其配置为在构建时将包发布到本地目录。换句话说......
每个构建现在将类库作为NuGet包输出到解决方案的artifacts
目录。
要在单个本地NuGet源中访问所有包,请将以下postpack
脚本添加到类库的project.json
。该脚本将包复制到我们的本地NuGet源目录。 /y
选项会覆盖现有文件。
project.json
"scripts": {
"postpack":
"xcopy /y ..\\..\\artifacts\\bin\\%project:Name%\\Debug\\*.nupkg C:\\LocalPackages\\"
}
请参阅备注脚本的备注,该备份脚本同时复制调试和/或发行包。
打开位于单独解决方案中的MVC项目。请参阅备注,了解在不修改全局NuGet设置的情况下指定解决方案包的方法。
LocalPackages
的新包源。C:\LocalPackages
。准备发布时,将LocalPackages
条目替换为适当的NuGet源以进行生产。
从MVC项目中,访问本地NuGet包。
LocalPackages
。(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>