如何使用dotnet(.NET Core)打包包含sql项目的sln文件?

B. *_*ter 9 c# msbuild .net-core

我有一个没什么特别的.NET Core解决方案,我们可以调用它Application.sln,它包含12个C#项目和1个SQL项目.在Visual Studio 2017中,我没有构建所有项目的问题,但是当我前往命令行使用打包项目时dotnet pack Application.sln --no-build,我立即遇到了sql项目的问题.这是错误:

error MSB4019: The imported project "C:\Program Files\dotnet\sdk\1.1.0\Microsoft\VisualStudio\v14.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk
Run Code Online (Sandbox Code Playgroud)

在解读之后,我发现第一部分C:\Program Files\dotnet\sdk\1.1.0来自我使用dotnet而不是msbuild来打包解决方案,而且由于SSDT无法安装到dotnet文件夹中,这将失败.

最好,我希望它忽略.sqlproj项目,只包装.csproj项目,因为我将在之后单独处理sql项目,但我没有看到任何方法这样做.有办法吗?似乎我不能使用MSBuild样式的通配符作为dotnet pack(***.csproj)的参数,因为它会抛出一个单独的错误.

我尝试过使用msbuild/t:pack,但这给了我其他问题(它说项目中不存在目标"pack").

有人对我有什么建议吗?如果它有帮助,我想通过TeamCity这样做,但所有这些问题也存在于我的开发机器上.

Mar*_*ich 7

首先,如果要使用这些dotnet工具,则需要创建仅包含c#项目的第二个解决方案.如果您不想这样做,您可以直接从VS 2017开发人员命令提示符(dotnet restore=> msbuild /t:Restore等)直接使用msbuild命令.

Pack目标仅适用于具有集成NuGet包支持的项目,该项目通过使用Microsoft.NET.SdkSDK("新"csproj格式)或在NuGet.Build.Tasks.Pack与其兼容的项目中使用nuget包来实现.

如果要在不创建没有sql项目的第二个解决方案的情况下调用dotnet pack/ msbuild /t:Pack打开解决方案,则所有项目都必须包含打包目标.

一种简单的方法是Directory.Build.props使用以下内容在解决方案旁边创建一个文件:

<Project>
  <Target Name="Pack" />
</Project>
Run Code Online (Sandbox Code Playgroud)

此文件将在目录层次结构中的所有项目的开头自动导入,并Pack在其中定义空目标.然后,使用.NET SDK的项目将使用实际的NuGet包目标覆盖此目标.因此,msbuild /t:Pack将在SQL项目上调用此空目标,并Pack在c#项目上调用原始NuGet 目标.

  • 有趣.只要没有其他`Directory.Build.props`文件,解决方法应该有效,但我只是从命令行尝试,而不是形成CI设置. (2认同)