Nuget将原生dll复制到输出

时间:2016-02-03 12:19:19

标签: tfs msbuild nuget

我有自己的nuget包,其中包含一些原生的dll文件。

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

如何创建将文件复制到输出目录的nuget pacakge?

我已尝试使用Baseclass.Contrib.Nuget.Output,但我无法在构建服务器上使用它(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):The此编译的源文件位于:" 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):An编译期间发生错误。错误CS1705:程序集' Microsoft.Build.Utilities.Core,Version = 14.0.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,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):The " PackageFilter"找不到任务。请检查以下内容:1。)项目文件中任务的名称与任务类的名称相同。 2.)任务类是" public"并实现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):An编译期间发生错误。错误CS1705:程序集' Microsoft.Build.Utilities.Core,Version = 14.0.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,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):The " PackageFilter"找不到任务。请检查以下内容:1。)项目文件中任务的名称与任务类的名称相同。 2.)任务类是" public"并实现Microsoft.Build.Framework.ITask接口。 3.)在项目文件或位于" C:\ Program Files(x86)\ MSBuild \ 14.0 \ bin \ amd64"中的* .tasks文件中正确声明任务。 。目录

1 个答案:

答案 0 :(得分:0)

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

 <Target Name="AfterBuild">
   <ItemGroup>
     <NugetDlls Include="$(SolutionDir)\packages\mypackage\**\*.dll" />
   </ItemGroup>
   <Copy SourceFiles="@(NugetDlls)" DestinationFolder="$(OutputPath)" />
 </Target>

您甚至可以使用start.ps1 PowerShell script in the Tools directory通过Nuget自动执行此更改。在这种情况下,我将使用上面的MSBuild Target创建一个单独的.targets文件,将其添加到Nuget包中,然后通过install.ps1脚本在项目文件中导入此目标文件。 install.ps1类似于(虽然我没有测试过,但可能需要一些调整):

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()