2017-08-27 47 views
4

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

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 

破译那之后,我发现,第一部分,C:\Program Files\dotnet\sdk\1.1.0使用DOTNET代替的MSBuild打包了解决方案来自我,因为SSDT不能被安装到DOTNET文件夹,这将失败。

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

我已经尝试使用msbuild/t:pack,但这给了我其他问题(它表示目标“包”不存在于项目中)。

有没有人对我有任何建议?如果有帮助,我想通过TeamCity来做到这一点,但所有这些问题也存在于我的开发机器上。

+2

你可以卸载SQL项目吗? – Prajwal

+0

我可以,但最终目标是在CI环境中运行,这不是一个可行的解决方案,我不这么认为。 –

回答

4

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

Pack目标仅适用于集成NuGet包的支持项目,它通过使用​​SDK(“新”csproj格式)或在与其兼容的项目中使用nuget软件包来实现。

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

一个简单的方法是创建一个Directory.Build.props文件包含以下内容的解决方案旁:

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

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

+0

最后,我不得不诉诸使用2 slns,这不是我的首选方法来解决这个问题。我尝试了你建议的其他修复,但这在TeamCity中看起来似乎没有用。感谢您帮助确认两个slns是获得理想行为的唯一途径。 –

+2

有趣。只要没有其他的'Directory.Build.props'文件,解决方法应该可以工作,但我只能从命令行尝试它,而不是通过CI设置。 –

+0

fyi你还可以使用msbuild脚本来执行所有必要的任务,而不是太依赖配置命令.. https://gist.github.com/dasMulli/69f5303aa79a8cd4060e44891c90fd2d –

相关问题