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



我有一个没有什么特别的.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 Filesdotnetsdk1.1.0MicrosoftVisualStudiov14.0SSDTMicrosoft.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

破译后,我发现第一部分,C:Program Filesdotnetsdk1.1.0来自我使用 dotnet 而不是 msbuild 来打包解决方案,并且由于 SSDT 无法安装到 dotnet 文件夹中,这将失败。

最好是我希望它忽略 .sqlproj 项目并只打包 .csproj 项目,因为我之后将单独处理 sql 项目,但我看不到任何方法可以做到这一点。有办法吗?我似乎无法使用 MSBuild 样式通配符作为参数来dotnet pack(***.csproj),因为这会引发单独的错误。

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

有人对我有什么建议吗?如果有帮助,我想通过 TeamCity 执行此操作,但所有这些问题也存在于我的开发计算机上。

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

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

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

执行此操作的一种简单方法是在解决方案旁边创建一个包含以下内容的Directory.Build.props文件:

<Project>
<Target Name="Pack" />
</Project>

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

最新更新