ASP.NET Core RC2项目参考“无法解析依赖关系X”

概观

我有一个ASP.NET Core RC2 .NET框架Web项目,我想在同一解决方案中包含的常规C#类库中添加一个项目引用。

重现的步骤:

使用Visual Studio 2015 Update 2

文件 – >新项目 – > ASP.NET Core Web Application (.NET Framework)

右键单击解决方案 – >新建项目 – > Class Library

我没有做这些:

  • Class Library (.NET Core)
  • Class Library (Portable for iOS, Android, and Windows)
  • Class Library (Portable)

将以下内容添加到project.json中的dependencies

 "ClassLibrary1": { "version": "*", "target": "project" } 

问题

为什么我不能在指定项目依赖项时向我的依赖项添加"target":"project"

在此处输入图像描述

期望

我希望这个ASP.NET Core RC2 Web应用程序(.NET Framework)能够引用常规类库作为项目引用。

这很有效

 "ClassLibrary1": "*" 

这不起作用

 "ClassLibrary1": { "version": "*", "target": "project" } 

我的问题

如何从ASP.NET Core RC2 Web项目向常规类库添加项目引用?

附加信息

如果我运行dotnet restore我会得到一个更好的错误消息,说明为什么无法解决这个问题。

 dotnet : At line:1 char:1 + dotnet restore + ~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError Errors in C:\users\joshs\documents\visual studio 2015\Projects\WebApplication4\src\WebApplication4\project.json Unable to resolve 'ClassLibrary1' for '.NETFramework,Version=v4.6.1'. 

我加倍检查了类库.NET Framework 4.6.1

在此处输入图像描述

我已经看过不能添加.net核心类库asp.net核心rc2的引用 ,但这是针对.NET Core类库的。

我还查看了ASP.NET核心MVC Web应用程序(RC2)中的参考完整框架库项目? ,但那是因为用户试图创建一个不针对.NET Framework的Web项目。 我的project.json包含:

  "frameworks": { "net461": { } }, 

如果我右键单击我的Web项目和“添加引用”,然后继续选择我的类库,它将项目依赖项放在project.json的不同部分,但它仍然给我相同的错误消息。

 "frameworks": { "net461": { "dependencies": { "ClassLibrary1": { "target": "project" } } } }, 

你可以参考:

  • 来自project.json经典C#类库,目标是完整的dotnet框架
  • 来自project.json PCL C#类库,目标是完整的dotnet框架和/或CoreCLR

如果您的C#类库不是PCL,那么您只能从project.json的完整dotnet部分( net* )引用它

要从VS引用,请右键单击项目 – >引用 – >选择项目

一旦https://github.com/dotnet/cli/issues/3199得到解决,Victor的回答应该有效。 与此同时,我正在使用以下工作:

概观


每次我构建我的类库项目时,我都在创建一个带有新版本号的NuGet包。 我的ASP.NET Core RC2 project.json将NuGet包引用为带有通配符(*)版本引用的常规依赖项。 然后,我在每次构建之后让我的ASP.NET Core RC2项目恢复包,这样它就可以获取最新的更改。


每次构建后创建NuGet包

在您的类库项目中,将NuGet引用添加到https://www.nuget.org/packages/CreateNewNuGetPackageFromProjectAfterEachBuild

这将在您的项目中创建一个文件夹结构,如下所示:

在每个Build文件夹结构之后从Project创建NuGet包

编辑Config.ps1文件并将$appendConfigurationAndPlatformToNuGetPackageFileName更改为$false 。 (我发现我的引用无法正常使用此设置为$true

如果您希望能够调试到您的类库项目, $packOptions = ""更改为$packOptions= "-Symbols"

此时,如果要构建项目,将在输出目录(通常为bin )中创建NuGet包。 此脚本使用AssemblyInfo.cs文件来驱动程序包的版本号。

更新AssemblyInfo.cs版本

让我们添加一个脚本来在每次构建之后更新该assemblyinfo.cs文件版本,并将我们的NuGet包的位置更改为本地存储库。

我把这个脚本添加到我的项目中: https : //github.com/eoincampbell/powershell-scripts/blob/master/Update-AssemblyFileVersion.ps1每次调用它时,它都会更新AssemblyInfo.cs版本号。

我稍微调整了脚本以更新AssemblyFileVersion和AssemblyVersion行。 更改

if ($_.StartsWith("[assembly: AssemblyFileVersion")) {

if ($_.StartsWith("[assembly: AssemblyFileVersion") -or $_.StartsWith("[assembly: AssemblyVersion")) {

构建自动化

现在我们希望在每次构建之后发生这个脚本,这样我们就不必每次都手动运行脚本。 此外,我将更改我的类库的NuGet输出的位置,因为我在ASP.NET Core项目引用的解决方案中有多个类库项目。

编辑您的类库.csproj文件。 你会发现类似的东西:

   REM Create a NuGet package for this project and place the .nupkg file in the project's output directory. REM If you see this in Visual Studio's Error List window, check the Output window's Build tab for the actual error. ECHO Creating NuGet package in Post-Build event... PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '$(ProjectDir)_CreateNewNuGetPackage\DoNotModify\CreateNuGetPackage.ps1' -ProjectFilePath '$(ProjectPath)' -OutputDirectory '$(TargetDir)' -BuildConfiguration '$(ConfigurationName)' -BuildPlatform '$(PlatformName)'"  

添加PreBuildEvent以运行脚本,并将-OutputDirectory更改为本地NuGet存储库(如果已有)。 否则,您可以将包转储到此解决方案的所有类库的共享文件夹(这就是我所做的)

    ECHO Starting Pre Build Event PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '$(ProjectDir)_CreateNewNuGetPackage\DoNotModify\Update-AssemblyFileVersion.ps1' -assemblyInfoFilePath '$(TargetDir)..\\..\\Properties\\AssemblyInfo.cs'  REM Create a NuGet package for this project and place the .nupkg file in the project's output directory. REM If you see this in Visual Studio's Error List window, check the Output window's Build tab for the actual error. ECHO Creating NuGet package in Post-Build event... PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '$(ProjectDir)_CreateNewNuGetPackage\DoNotModify\CreateNuGetPackage.ps1' -ProjectFilePath '$(ProjectPath)' -OutputDirectory '$(TargetDir)..\\..\\..\\LocalPackages\' -BuildConfiguration '$(ConfigurationName)' -BuildPlatform '$(PlatformName)'"  

如果您现在要构建,每次都会创建NuGet包,但是您的ASP.NET Core应用程序不会获取新包。 为了解决这个问题,我在dotnet restore添加了一个预编译命令。

注意:intellisense不正确,使用precompile而不是precompile (有关详细信息,请参阅https://github.com/dotnet/cli/issues/3338 )

  "scripts": { "precompile": "dotnet restore", "prepublish": [ "npm install", "bower install", "gulp copy", "gulp clean", "gulp min" ], } 

ASP.NET Core RC2 project.json

我的引用只是普通的依赖:

 "dependencies": { "Microsoft.AspNetCore.Mvc.Core": "1.0.0-rc2-final", . . "Lib.IO": "*", "Lib.Core": "*", "Lib.Data": "*", } 

显着的问题


  • 我没有打算写一个脚本来清理我的NuGet存储库,因为经过一天的编码,我会找到几十个我的类库包。 现在,我只是在一天结束时手动清理它们。

  • 每次构建ASP.NET Core时,都需要一段时间,因为在每次构建之前都要恢复包。 如果您真的很有创意,可以执行脚本来检测是否有更新的类库包,然后运行dotnet restore

  • 这是最大的痛苦。 每次更改类库时,都必须记住构建它,因为您的Web项目不再具有项目引用,它不会自动构建类库。

在工作3天后,我将整天解决类似的项目参考错误,将解决方案从RC1转换为RC2。 以下是我可能与此问题相关的一些调查结果:

  1. 通过直接编辑project.json来添加项目引用效果不好,因为需要将一个ItemGroup-> ProjectReference条目添加到xproj文件中,这似乎只在使用引用 – >添加引用时发生.. – >选择项目。
  2. RC2中引用的项目名称及其程序集名称必须匹配(无空格字符)(这在RC1中不是问题)。
  3. 我有非nuget程序集依赖项(使用Browse …按钮添加),这在RC2中不起作用,并显示以下错误: “。Net Core项目仅支持在此版本中引用.NET框架程序集。引用其他程序集,它们需要包含在NuGet包中并引用该包。“ 。 我对RC 2的解决方案是为这些程序集创建nuget包并设置一个私有nuget服务器: http ://docs.nuget.org/Contribute/Ecosystem#nuget-server-project

顺便说一句,我正在使用VS 2015 Update 2.很明显,这些问题可能是由于VS 2015 Tooling / SDK Preview 1中的限制/错误而不是ASP Core 1.0 RC2本身的问题。