Nuget包生成排除lib文件夹

问题描述 投票:0回答:10

我正在尝试使用 .nuspec 文件生成 nuget 包。我们在一个屋檐下有几个项目,并试图创建 nLog.config(和转换文件)并通过 nuget 包分发它。对于任何版本的 .Net Framework,我都在寻找相同的配置文件集(只有配置没有 dll)。所以我真的不需要 \lib et45\myproject.dll 或 \lib et40\我的项目.dll。虽然当我生成 nuget 包时,它总是创建 lib 文件夹并包含 dll。为与 .net Framework 版本相关的任何项目创建哪种依赖关系。

下面是我的 nuspec 文件,以防有人想参考我做错了什么。我尝试了 "" 和其他一些东西,但没有运气。

<?xml version="1.0"?>
<package >
  <metadata>
    <id>NLogConfig</id>
    <version>1.0.3</version>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <copyright>Copyright 2013</copyright>
    <dependencies>
      <dependency id="NLog" version="2.1.0" />
      <dependency id="NLog.Schema" version="2.1.0" />
    </dependencies>
  </metadata>
  <files>    
    <file src="NLog.config" target="content" />
    <file src="NLog.Debug.config" target="content" />
    <file src="NLog.UAT.config" target="content" />
    <file src="NLog.Release.config" target="content" />
    <file src="tools\*.*" target="tools"/>          
  </files>
</package>

如何使用 nuspec 文件(首选)或其他机制完全排除 lib 文件夹?谢谢!!

enter image description here

更新一:

我试图偷偷摸摸,但没有成功。我放置了构建后事件并试图删除 DLL。但不知何故,系统很聪明,它给了我错误“错误 79 无法在 \Release\NLogConfig.dll 中找到‘C:\GITRepo\NLogConfig\NLogConfig’。确保项目已经构建。”

更新 2

我没有找到使用 .csproj 构建 nuget 包的方法,但是使用外部命令并指定 nuspec 文件我能够获得相同的结果。问题仍然存在,这只是我的解决方法。

c# .net visual-studio-2012 nuget nuget-package
10个回答
15
投票

我想分享我的经验。我需要的是使用 csproj 作为 Nuget.exe 目标(因为我希望 NuGet 自动解析依赖项)并且结果包中没有 lib 文件夹。为了省略该文件夹,我使用了以下命令:

nuget pack <projectPath> -Exclude bin/**/*.*

7
投票

使用 NuGet Pack 命令选项 -Tool。请参阅https://learn.microsoft.com/en-us/nuget/tools/cli-ref-pack

“确定项目的输出文件是否应该在工具文件夹中。”


5
投票

我通过首先排除项目输出文件夹中的所有文件解决了这个问题

<file src="bin\**\*.*" target="lib\net451" exclude="bin\**\*.*" />

然后当通过 NuGet.exe 实际打包时,我针对我的 .nuspec 和 not 我的 csproj。生成的包不包含 /lib 文件夹下我项目的输出 dll。


1
投票

这是按项目打包时的预期行为,因为重点是 nuget 将读取项目并相应地生成包。找到的任何 .nuspec 只能添加内容,不能删除任何以前添加的内容。

所以你注意到你的第二次更新是你应该做的 - 改为由 .nuspec 打包。


0
投票

您可以使用 exclude 语法将 lib 文件包含在包中。像下面这样的东西:

<files>
<file src="bin\Debug\*.*" exclude="bin\Debug\*.dll" />
</files>

更多信息参考http://docs.nuget.org/docs/reference/nuspec-reference


0
投票

您必须删除依赖项元素,直到您将使用项目构建包 nuget 将添加对这些 dll 的引用

<?xml version="1.0"?>
<package >
  <metadata>
    <id>NLogConfig</id>
    <version>1.0.3</version>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <copyright>Copyright 2013</copyright>
  </metadata>
  <files>    
    <file src="NLog.config" target="content" />
    <file src="NLog.Debug.config" target="content" />
    <file src="NLog.UAT.config" target="content" />
    <file src="NLog.Release.config" target="content" />
    <file src="tools\*.*" target="tools"/>          
  </files>
</package>

0
投票

我也遇到了这个问题,我的解决方法是从项目中分离包创建,我无法在 nuspec 文件中使用通配符。我的解决方法是使用 install.ps1 PowerShell 脚本,该脚本将在将包添加到项目后运行。但是,您需要首先在程序包管理器控制台中设置 ExecutionPolicy,以便 PowerShell 脚本可以运行。

param($installPath, $toolsPath, $package, $project)
$project.Object.References | Where-Object { $_.Name -eq 'NLogConfig' } | ForEach-Object { $_.Remove() }

我真的不喜欢这种解决方法,因为它将无法在 ExecutionPolicy 受限(默认情况下)的机器上运行。


0
投票

所以我遇到了同样的问题,我真的不在乎是否包含 .dll,而是在我的内容中发布了 .cs,因为该类将存在于添加到目标项目的内容和添加到目标项目的 dll 中是在安装包时添加的(猜测你正在做同样的事情)。

我最终将内容文件夹中的 .cs 文件的构建操作更改为 NONE,这样它们就不会出现在 DLL 中。

注意: 当您执行此操作时,.cs 文件中的任何代码都没有经过验证,因此当您知道一切正确时,您将希望将此作为最后一步执行

完全排除 DLL 会很好,但这是我使用项目作为构建的解决方法。

希望这对某人有帮助


0
投票

尝试将此行添加到您的项目文件中,对我有用:

<None Remove="bin\**\*.*"/>

0
投票

通常你不需要/想要一个

.nuspec
文件。在这种情况下,您可以从项目文件中控制它:

<PropertyGroup>
  <IncludeBuildOutput>false</IncludeBuildOutput>
  <IncludeSymbols>false</IncludeSymbols>
</PropertyGroup>
© www.soinside.com 2019 - 2024. All rights reserved.