Nuget包生成Exclude lib文件夹

时间:2013-12-02 20:03:05

标签: c# .net visual-studio-2012 nuget nuget-package

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

以下是我的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

更新1:

我试图偷偷摸摸但没有成功。我把post build事件和试图删除DLL。但不知何故系统很聪明它给了我错误“错误79无法找到'C:\ GITRepo \ NLogConfig \ NLogConfig \ bin \ Release \ NLogConfig.dll'。确保项目已经建成。”

更新2

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

8 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:5)

我首先排除了项目输出文件夹中的所有文件

,从而解决了这个问题
<file src="bin\**\*.*" target="lib\net451" exclude="bin\**\*.*" />

然后当通过NuGet.exe实际打包时,我将我的.nuspec和不是我的csproj作为目标。生成的包在/ lib文件夹下不包含项目的输出dll。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

您可以使用exclude语法将lib文件保留在包中。如下所示:

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

有关详细信息,请参阅http://docs.nuget.org/docs/reference/nuspec-reference

答案 5 :(得分: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>

答案 6 :(得分:0)

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

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

我真的不喜欢这种解决方法,因为它无法在限制ExecutionPolicy的机器上运行,这是默认的。

答案 7 :(得分:0)

所以我遇到了同样的问题,我并不在乎是否包含.dll但是在我的内容中发布了.cs,因为该类将存在于添加到目标项目的内容和安装软件包时添加的dll(猜测你在同一行上做了什么)。

我最终将构建操作更改为内容文件夹中的.cs文件为NONE,以便它们不会在DLL中结束。

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

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

希望这有助于某人