.net – 如何在解决方案上有选择地使用dotnet pack

我有一个解决方案foo.sln.其中的所有库都是SDK项目.但是只应该包装其中一个

默认情况下

dotnet pack

试图打包所有项目.没有排除过滤器或包含过滤器.推荐的流程是什么?

最佳答案 您可以通过在csproj文件中设置属性来选择要作为nuget包打包的项目,如下所示:

< IsPackable>真< / IsPackable> – 创建包

< IsPackable&GT假LT; / IsPackable> – 不要创建包

如果您不想在每个文件中指定它,可以在目录中创建一个名为Directory.Build.props的文本文件,其中包含以下内容:

<Project>
  <PropertyGroup>
    <IsPackable>false</IsPackable>
  </PropertyGroup>
</Project>

它将自动包含在此项目和所有嵌套文件夹中的SDK项目文件(csproj)的开头,因此您可以为这组项目指定公共默认值,如果需要,可以在单个csproj文件中覆盖它们.

如果您不希望它们被覆盖或需要使用csproj中定义的某些值,则应使用文件名Directory.Build.targets,它将自动包含在csproj的末尾.

在我们的项目中,我们使用以下结构:

 \
   \src
      <actual projects>
      Directory.Build.props
   \tests
      <unit tests>
      Directory.Build.props
   Directory.Build.props
   MySolution.sln

通过这种方式,我们可以为测试和常规项目指定不同的公共属性.

关于这一点的一个注意事项是,默认情况下,只应用csproj找到的第一个Directory.Build.propst,要更改此行为,您需要在嵌套的Directory.Build.props文件的开头添加此行(在Project标记内):

  <Import Project="$([MSBuild]::GetPathOfFileAbove('$(_DirectoryBuildPropsFile)', '$(MSBuildThisFileDirectory)../'))" />

关于所有这些的更多信息可以在这里找到:https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2017

点赞