Tfs Nuget将本机dll复制到输出中

Tfs Nuget将本机dll复制到输出中,tfs,msbuild,nuget,Tfs,Msbuild,Nuget,我有自己的nuget包,其中包含一些本机dll文件 当我构建引用nuget包的项目时,我希望将nuget包中的所有本机文件复制到输出目录中 如何创建这样的nuget包,将文件复制到输出目录中 我已尝试使用,但无法在我的构建服务器上使用(TFS 2013): C:\Builds\1\MyProject\BuildName\src\MyProject\Packages\Baseclass.Contrib.Nuget.Output.2.1.0\build\net40\Baseclass.Contrib

我有自己的nuget包,其中包含一些本机dll文件

当我构建引用nuget包的项目时,我希望将nuget包中的所有本机文件复制到输出目录中

如何创建这样的nuget包,将文件复制到输出目录中

我已尝试使用,但无法在我的构建服务器上使用(TFS 2013):

C:\Builds\1\MyProject\BuildName\src\MyProject\Packages\Baseclass.Contrib.Nuget.Output.2.1.0\build\net40\Baseclass.Contrib.Nuget.Output.targets(73):此编译的源文件位于:“C:\Users\MHABLDSvc\AppData\Local\Temp\fd4f7f9d-59e3-4f6a-af8c-6a48deb7af3e.txt”

C:\Builds\1\MyProject\BuildName\src\MyProject\Packages\Baseclass.Contrib.Nuget.Output.2.1.0\build\net40\Baseclass.Contrib.Nuget.Output.targets(73):编译期间发生错误。错误CS1705:程序集“Microsoft.Build.Utilities.Core,Version=14.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”使用“Microsoft.Build.Framework,Version=14.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”,其版本高于引用的程序集“Microsoft.Build.Framework,Version=12.0.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'

C:\Builds\1\MyProject\BuildName\src\MyProject\Packages\Baseclass.Contrib.Nuget.Output.2.1.0\build\net40\Baseclass.Contrib.Nuget.Output.targets(73):找不到“PackageFilter”任务。检查以下内容:1.)项目文件中任务的名称与任务类的名称相同。2.)任务类是“公共”的,并实现Microsoft.Build.Framework.ITask接口。3.)任务在项目文件中或位于“C:\Program files(x86)\MSBuild\14.0\bin\amd64”目录中的*.tasks文件中正确声明

C:\Builds\1\MyProject\BuildName\src\MyProject\Packages\Baseclass.Contrib.Nuget.Output.2.1.0\build\net40\Baseclass.Contrib.Nuget.Output.targets(73):编译期间发生错误。错误CS1705:程序集“Microsoft.Build.Utilities.Core,Version=14.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”使用“Microsoft.Build.Framework,Version=14.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”,其版本高于引用的程序集“Microsoft.Build.Framework,Version=12.0.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'

C:\Builds\1\MyProject\BuildName\src\MyProject\Packages\Baseclass.Contrib.Nuget.Output.2.1.0\build\net40\Baseclass.Contrib.Nuget.Output.targets(73):找不到“PackageFilter”任务。检查以下内容:1.)项目文件中任务的名称与任务类的名称相同。2.)任务类是“公共”的,并实现Microsoft.Build.Framework.ITask接口。3.)任务在项目文件中或位于“C:\Program files(x86)\MSBuild\14.0\bin\amd64”目录中的*.tasks文件中正确声明


您可以编写一些MSBuild逻辑来执行此操作。我还没有测试过这段代码,但您可以使用类似于以下内容的东西(通过调整):


为什么不在项目文件中设置被引用程序集的CopyLocal?因为它们不是程序集,也没有被引用。您可以使用添加到项目中的任何文件来执行此操作。但是该属性名为Copy to Output Directory。这也适用于本地构建。它包含大量本机opencv文件(数百兆字节)。如果添加这样的包,是否希望它将所有文件添加到项目中?如果你有一个应用程序,它使用了几个这样的包,它将是一团混乱。另一件事是,包括be在内的一些人没有将it nuget包检查到源代码管理中,因为我们在构建期间使用自动nuget恢复。我希望避免将大量大型文件检查到源代码管理中,尤其是当它们不是源代码时。如果您正在创建一个包,请参见。您可以在.nuspec文件中使用
项,如果需要更好的复制逻辑(例如,检测.dll是否为本机),也可以添加PowerShell脚本。编辑项目文件的维护有点麻烦。“mypackage”通常包含一个版本号。也许使用mypackage*可以工作,但您必须始终记住,您弄乱了项目文件:)您可以使用通配符(即“mypackage****.dl”)忽略软件包上的版本号,但我同意这很麻烦。如果这是一个web应用程序,您可以将此代码放在[projectName].wpp.targets文件中,使其更为可见。最后,我认为除了引用DLL之外,这个解决方案是最好的选择。我需要创建一个可以正常工作的nuget包。我不能强迫人们编辑他们的.csproj以使用我的包。为什么不添加对DLL的引用呢?因为它们不是程序集。。。不能添加包含com对象的引用do本机dll。
 <Target Name="AfterBuild">
   <ItemGroup>
     <NugetDlls Include="$(SolutionDir)\packages\mypackage\**\*.dll" />
   </ItemGroup>
   <Copy SourceFiles="@(NugetDlls)" DestinationFolder="$(OutputPath)" />
 </Target>
param($rootPath, $toolsPath, $package, $project)

# Add targets file to .csproj
$TargetsFile = 'AddToOutput.targets'
$path = [System.IO.Path]
$ProjectDirectory = $path::GetDirectoryName($project.FileName)
$TargetsPath = [System.IO.Path]::Combine($toolsPath, $TargetsFile)

Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

$MSBProject = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($project.FullName) |
    Select-Object -First 1

$ProjectUri = New-Object -TypeName Uri -ArgumentList "file://$($project.FullName)"
$TargetUri = New-Object -TypeName Uri -ArgumentList "file://$TargetsPath"

$RelativePath = $ProjectUri.MakeRelativeUri($TargetUri) -replace '/','\'

$ExistingImports = $MSBProject.Xml.Imports |
    Where-Object { $_.Project -like "*\$TargetsFile" }
if ($ExistingImports) {
    $ExistingImports | 
        ForEach-Object {
            $MSBProject.Xml.RemoveChild($_) | Out-Null
        }
}
$MSBProject.Xml.AddImport($RelativePath) | Out-Null
$project.Save()