c# - 在 NuGet 安装时将文件复制到 Android 项目
问题描述
期望的输出
我们想.dll
通过 NuGet 包安装分发一个(NetStandard 项目)和一些文件。在Xamarin.Android
项目中安装它时:
- 文件 (
Directory.Buil.props
) 被复制到解决方案文件夹 - 可执行文件 (
config.exe
) 被复制到项目文件夹 - 将目录 (
Files
) 及其内容复制到项目文件夹中
问题
- 使用的项目
PackageReference
不会复制文件(content
不支持) - 出于某种原因,在使用
.nuspec
文件时;源文件obj
等bin
也被打包
解决方案
理想情况下,我们希望:
- 只使用一个
.csproj
文件(没有.nuspec
) - 没有两个都
content
装contentFiles
在里面.nupkg
- 轻松
.dll
访问.csproj
- 安装较新
.nupkg
版本时,旧文件将被覆盖
问题
(1)这对PackageReference
and可行contentFiles
吗?
(2)你能想到的最好的方法是什么?
谢谢。
回应
狮子座:
在 Android 项目中安装包时,文件不会出现在项目中。更不用说这些文件只是被引用而不是被复制(即使我有copyToOutput="true"
):
狮子座(编辑):
我无法使用新的 SDK csproj 格式。取自您的链接:
免责声明:这只适用于一小部分项目类型。
- 类库项目
- 控制台应用程序
- ASP.NET Core Web 应用
- .NET 核心
如果您正在构建 ASP.NET 4(即不是 ASP.NET Core)、WPF、通用 Windows 或 Xamarin 项目,则必须坚持使用旧格式
解决方案
(1) 这对 PackageReference 和 contentFiles 可行吗?
恐怕您无法将这些文件添加到 Android 项目中,但我想在这里提供一个替代解决方案,将这些文件添加到输出文件夹中。
您可以将PackageReference
andcontentFiles
直接用于后两个要求,config.exe
而Files
. 但是对于第一个需求Directory.Buil.props
,我们需要做更多的事情,因为它被复制到解决方案文件夹而不是项目文件夹。
对于后两个 requirementsconfig.exe
和,Files
我们可以使用.nuspec
file withcontentFiles
来包含它们,需要 set 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>
打包后将.nuspec
生成的包安装到项目中。
但是,我们无法在 References 节点下找到这些文件。那是因为该项目仍然使用旧的 csproj 而packagereference
没有使用新的 sdk csproj。
旧 csproj 到新 csproj:Visual Studio 2017 升级指南
此外,不支持将文件复制到项目的源目录中,并且对于经典项目一直是不鼓励的做法。该contentFiles
部分控制为这些文件生成的 msbuild 项到 obj\projectname.csproj.nuget.g.props 文件中。并检查project.assets.json
您可以找到的文件:
"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"
}
}
请参阅:nuspec contentFiles 未添加到项目中
然后我们需要构建这个项目,这些文件将复制到输出文件夹。
对于第一个需求,为了将 .targets 添加Directory.Buil.props
到解决方案文件夹,我们需要在文件中创建一个自定义复制目标YourPackageName.targets
,然后将此 .targets 文件添加到\build
文件夹中,.targets 文件如下所示:
<?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>
.nuspec 文件如下:
<files>
<file src="<>\xxx.targets" target="build" />
</files>
希望这可以帮助。
推荐阅读
- java - 忽略依赖项中的 Javadoc 错误
- android - 任何人都可以解释错误和/或提供上传的 logcat ss 的一些解决方案吗?
- javascript - Firefox 将 URI 转换为 URL:如何强制它显示 URI
- r - 查找与两种模式中的任何一种匹配的名称
- python - 使用 BeautifulSoup 抓取 CSS 类中的特定元素
- php - 您可以提供哪些详细信息来帮助我了解如何执行 AJAX 以将数据传递到 Datatable 列
- google-cloud-platform - 将数据流式传输到 BQ - 服务帐户所需的理想最低权限
- antd - Ant Design 中的选项卡式表单不可能
- reactjs - 如何使用 ClassName 导入元素 react-js 的样式
- ghostscript - Ubuntu 20.04 上的 ttf2ufm_x2gs