在NuGet安装

时间:2018-06-18 12:39:36

标签: c# xamarin xamarin.android visual-studio-2017 nuget

所需的输出

我们希望通过NuGet包安装分发.dll(NetStandard项目)和一些文件。在Xamarin.Android项目中安装时:

  • 将文件(Directory.Buil.props)复制到解决方案文件夹
  • 将可执行文件(config.exe)复制到项目文件夹
  • 目录(Files)及其内容将复制到项目文件夹

问题

  • 使用PackageReference的项目无法复制文件(content不支持)
  • 出于某种原因,使用.nuspec文件时;源文件objbin等也已打包

解决方案

理想情况下,我们希望:

  • 仅使用.csproj文件(不含.nuspec
  • content
  • 中没有contentFiles.nupkg
  • 轻松访问.dll
  • 中的.csproj
  • 安装较新的.nupkg版本时,旧文件将被覆盖

问题

(1)这适用于PackageReferencecontentFiles吗?

(2)您能想到的最佳方法是什么?

感谢。

的响应

利奥

在Android项目中安装软件包时,文件不会出现在项目中。更不用说文件只是被引用而不是被复制(即使我有copyToOutput="true"):

Solution projects after NuGet package installation

狮子座(编辑):

我无法使用新的SDK csproj格式。取自您的链接:

  

免责声明:这仅适用于一小组项目类型。

     
      
  • 类库项目
  •   
  • 控制台应用
  •   
  • ASP.NET核心网络应用
  •   
  • .NET Core
  •   
     

如果要构建ASP.NET 4(即非ASP.NET Core),WPF,Universal Windows或Xamarin项目,则必须坚持使用旧格式

1 个答案:

答案 0 :(得分:0)

  

(1)这是否适用于PackageReference和contentFiles?

我担心您无法将这些文件添加到Android项目中,但我想在此处提供替代解决方案,将这些文件添加到输出文件夹中。

您可以直接使用PackageReferencecontentFiles来满足后两个要求config.exeFiles。但是对于第一个要求Directory.Buil.props,我们需要做更多的事情,因为它被复制到解决方案文件夹而不是项目文件夹。

对于后两个要求config.exeFiles,我们可以使用.nuspec文件和contentFiles来包含它们,需要设置{ {1}},如:

copyToOutput="true"

打包此<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MyTestCore</id> <version>4.0.0</version> <authors>TestContentFile</authors> <owners>TestContentFile</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>Package Description</description> <contentFiles> <files include="any/any/config.exe" buildAction="content" flatten="true" copyToOutput="true"/> <files include="any/any/Files/1.txt" buildAction="content" flatten="true" copyToOutput="true"/> <files include="any/any/Files/2.txt" buildAction="content" flatten="true" copyToOutput="true"/> </contentFiles> </metadata> <files> <file src="contentFiles/any/any/config.exe" target="contentFiles/any/any/config.exe" /> <file src="contentFiles/any/any/Files/1.txt" target="contentFiles/any/any/Files" /> <file src="contentFiles/any/any/Files/2.txt" target="contentFiles/any/any/Files" /> </files> </package> 后,将生成的软件包安装到项目中。

但是,我们无法在“参考”节点下找到这些文件。那是因为该项目仍然使用旧的csproj .nuspec不使用新的sdk csproj。

Old csproj to new csproj: Visual Studio 2017 upgrade guide

此外,不支持将文件复制到项目的源目录中,对于经典项目而言,这是一种沮丧的做法。 packagereference部分将为这些文件生成的msbuild项控制到obj \ projectname.csproj.nuget.g.props文件中。并查看您可以找到的contentFiles文件:

project.assets.json

请参阅:nuspec contentFiles not added to a project

然后我们需要构建这个项目,那些文件将被复制到输出文件夹。

对于第一个要求,为了将 "targets": { "MonoAndroid,Version=v7.1": { "MyTestCore/5.0.0": { "type": "package", "contentFiles": { "contentFiles/any/any/Files/1.txt": { "buildAction": "Content", "codeLanguage": "any", "copyToOutput": true, "outputPath": "1.txt" }, "contentFiles/any/any/Files/2.txt": { "buildAction": "Content", "codeLanguage": "any", "copyToOutput": true, "outputPath": "2.txt" }, "contentFiles/any/any/config.exe": { "buildAction": "Content", "codeLanguage": "any", "copyToOutput": true, "outputPath": "config.exe" } } 添加到解决方案文件夹,我们需要在Directory.Buil.props文件中创建自定义复制目标,然后添加它。将文件定位到YourPackageName.targets文件夹,.targets文件如下所示:

\build

.nuspec文件,如:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>  
        <MySourceFiles Include="<FilePath>\Directory.Buil.props"/>  
    </ItemGroup>  

    <Target Name="CopyFiles" BeforeTargets="Build">  
        <Copy  
            SourceFiles="@(MySourceFiles)"  
            DestinationFolder="<SolutionFolder>"  
        />  
    </Target>  

</Project>

希望这有帮助。