创建NuGet包,该包安装的引用的“复制本地”设置为false

创建NuGet包,该包安装的引用的“复制本地”设置为false,nuget,Nuget,有没有一种方法可以创建一个NuGet包,当该包安装到项目中时,它会添加对DLL的引用,并将“Copy Local”设置为false 我假设它是“install.ps1”文件中的某种脚本。是的,正如您所猜测的,您可以使用install.ps1执行此操作 下面是一个install.ps1示例,每次运行它时都会翻转System.dll上的标志。使用以下示例,您应该能够了解如何做自己想做的事情: param($installPath, $toolsPath, $package, $project) f

有没有一种方法可以创建一个NuGet包,当该包安装到项目中时,它会添加对DLL的引用,并将“Copy Local”设置为false


我假设它是“install.ps1”文件中的某种脚本。

是的,正如您所猜测的,您可以使用install.ps1执行此操作

下面是一个install.ps1示例,每次运行它时都会翻转System.dll上的标志。使用以下示例,您应该能够了解如何做自己想做的事情:

param($installPath, $toolsPath, $package, $project)

foreach ($reference in $project.Object.References)
{
    if($reference.Name -eq "System")
    {
        if($reference.CopyLocal -eq $true)
        {
            $reference.CopyLocal = $false;
        }
        else
        {
            $reference.CopyLocal = $true;
        }
    }
}
但是这个MSDN文档应该会有所帮助

  • 对象
    Hanselman使用解析到
  • $project
    变量NuGet为

我认为这个install.ps1满足了您的要求-包中添加的所有DLL的副本本地值都为false。请注意,在这里,除了从AssemblyReferences列表中获取所有名称之外,我并没有对它做任何事情——如果您想要基于目标框架等的条件,您可能需要做更多的事情

param($installPath, $toolsPath, $package, $project)

$asms = $package.AssemblyReferences | %{$_.Name}

foreach ($reference in $project.Object.References)
{
    if ($asms -contains $reference.Name + ".dll")
    {
        $reference.CopyLocal = $false;
    }
}

我发现了一篇Hanselman关于在NuGet Powershell脚本中“添加”引用的帖子:$project.Object.references.Add(“Microsoft.CSharp”);。这让我更接近了,但我很难找到显示如何选择和修改更改“复制本地”的参考的文档,并用更好的示例更新了答案。当我在VS2015中这样做时,出于好奇,我经常会得到重复的True False,为什么不想在本地复制文件?@kiewic这是一个很好的问题。这个问题我希望我5年前的自我记录下来,因为我现在还不知道!