C# Nuget包生成排除库文件夹

C# Nuget包生成排除库文件夹,c#,.net,visual-studio-2012,nuget,nuget-package,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 framework版本相关的项目创建依赖项的类型 下面是我的

我正在尝试使用.nuspec文件生成nuget包。我们在一个屋顶下有几个项目,试图创建nLog.config(和转换文件),并通过nuget包分发它。对于任何版本的.Net Framework,我都在寻找相同的配置文件集(仅配置没有dll)。所以我确实不需要\lib\net45\myproject.dll或\lib\net40\myproject.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>

NLogConfig
1.0.3
假的
版权所有2013
如何使用nuspec文件(首选)或其他机制完全排除lib文件夹?谢谢

更新1:

我试图偷偷摸摸,但没有成功。我放置了生成后事件并尝试删除DLL。但不知何故,系统是聪明的,它给了我错误“错误79无法找到'C:\GITRepo\NLogConfig\NLogConfig\bin\Release\NLogConfig.dll'。请确保项目已生成。”

更新2


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

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

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


有关更多信息,请参阅

您必须删除dependencies元素,并且在使用项目构建包之前,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>

NLogConfig
1.0.3
假的
版权所有2013

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

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

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

所以我也遇到了同样的问题,我真的不在乎是否包含.dll,但在我的内容中发布了.cs,因为该类将同时存在于添加到目标项目的内容和安装包时添加的dll中(猜测您是按照同样的思路进行操作的)

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

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

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


希望这对某人有所帮助

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


因此,您需要注意的是,您的第二次更新是您应该执行的操作—由.nuspec进行打包。

使用NuGet pack命令选项—工具。看


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

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

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


然后,当通过NuGet.exe进行实际打包时,我将目标锁定在了我的.nuspec上,而不是我的csproj上。生成的包在/lib文件夹下不包含我的项目的输出dll。

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

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

谢谢你的回复,丹!!不幸的是,它没有起作用。我想我的问题可能不太清楚,但我正在尝试使用true for release和using创建包,作为VisualStudio构建过程的一部分。像这样排除dll仍然包括lib文件夹和用同样的方法生成的dll。到目前为止,我发现唯一的选择是在外部使用nuspec和create package,或者在后期生成事件中使用相同的命令。这可能不起作用,因为未包括
目标
参数。感谢回复Giammin!!不幸的是,这对我不起作用。@TorontoKid这真的很奇怪……你是如何生成那个包的?如何调用nuget.exe?如果使用“”修改.csproj文件,并且对于给定的配置(在我的版本中),如果设置为true,则每次生成版本时,都会在输出文件夹中生成nuget包。您需要在根文件夹中具有.nuget\nuget.config、.nuget\nuget.exe和.nuget\nuget.targets才能使其工作。请让我知道这是否令人困惑,我可以向您发送带有设置屏幕截图的详细电子邮件。@TorontoKid我认为您必须从项目中分离包创建以使其工作感谢您查看@it!!这正是我为解决问题所做的。我更新了我的问题,在相同的“我没有找到办法使用.csproj来构建nuget包,但使用外部命令和指定nuspec文件,我能够获得相同的结果。问题仍然存在,这只是我的解决方法。”再次感谢您的建议。这确实有效,应该是marke