基于DocFX与CI/CD构建.NET私有NuGet包文档一体化管理方案

news2026/5/16 11:56:44
1. 项目概述与核心价值最近在整理团队内部的.NET技术资产时我重新审视了一个看似简单但极其重要的仓库abellobm3681/nuget-docs。这名字乍一看可能很多人会以为又是一个NuGet官方文档的镜像或者翻译项目。但如果你深入进去会发现它的价值远不止于此。这其实是一个经过深度定制和实战检验的“NuGet包管理与文档一体化”解决方案模板。它解决的痛点非常明确在中小型研发团队或快速迭代的产品线中如何系统化地管理内部NuGet包并让相关的使用文档、版本说明、最佳实践能够与包的生命周期紧密绑定而不是散落在各个Wiki、Confluence甚至聊天记录里最终导致“包发了但没人会用对”的尴尬局面。我自己就踩过这样的坑。早些年我们团队内部组件化推进时辛辛苦苦封装了十几个核心工具包每个包也都有对应的README.md。但问题来了README写得太简略同事用起来总遇到奇怪的问题包更新了文档没同步导致下游项目引用后各种兼容性报错想找一个历史版本的特性和变更说明得去翻提交记录效率极低。abellobm3681/nuget-docs这个项目正是为了终结这种混乱而生的。它不是一个简单的文档站而是一套将NuGet包源无论是私有的Azure Artifacts、ProGet还是简单的文件共享、包版本管理、自动化文档生成和静态站点部署串联起来的工程化实践。它特别适合那些已经开始做内部代码共享但缺乏规范流程的.NET技术团队能帮你快速搭建一个“自带说明书”的私有包生态系统。2. 整体架构设计与核心思路拆解2.1 为什么是“Docs”与“NuGet”的结合传统的做法里NuGet包和文档是两条平行线。包通过nuget push发布到服务器文档则可能放在另一个Git仓库或用其他工具维护。这种分离带来了信息同步的延迟和成本。abellobm3681/nuget-docs的核心思路是“文档即代码并与包同源”。它将每个NuGet包对应的详细文档包括但不限于快速开始、API详解、示例代码、版本迁移指南直接存放在该包的源代码仓库中与.csproj文件并列。然后通过一套自动化的流水线在打包和发布的同时抽取、渲染这些文档并集中发布到一个统一的、可搜索的静态网站上。这样做有几个显著优势保证一致性文档和包代码在同一提交下修改和发布从根源上避免了版本错配。降低贡献门槛开发者修改了代码逻辑或API后可以立即在同一个Pull Request中更新对应的文档评审者能一次性审查代码和文档的变更。自动化生成利用DocFX、Sandcastle或Wyam等.NET生态的文档生成工具可以从代码注释XML Doc和手写的Markdown文件自动生成专业的HTML文档站无需手动维护HTML。集中化门户最终生成的静态站点通常托管在内部服务器或Azure Storage Static Website上成为团队内部所有NuGet包的“统一门户”新成员可以在这里一站式查找、学习和使用所有内部组件。2.2 项目结构解析与核心组件典型的abellobm3681/nuget-docs仓库结构会包含以下核心部分这反映了其设计哲学nuget-docs-repo/ ├── .github/workflows/ # GitHub Actions 流水线定义 │ ├── ci-build-and-pack.yml # CI测试、打包 │ └── cd-deploy-docs.yml # CD发布文档站 ├── docs/ # 全局文档站点资源 │ ├── toc.yml # 全站导航目录 │ ├── index.md # 站点首页 │ └── styles/ # 自定义CSS样式 ├── src/ │ ├── Awesome.Core/ # 核心包项目 │ │ ├── Awesome.Core.csproj │ │ ├── README.md # 包专属详细文档 │ │ └── api/ # 包API文档的Markdown文件 │ └── Awesome.Utilities/ # 另一个工具包项目 ├── templates/ # 文档生成模板如DocFX模板 ├── docfx.json # DocFX主配置文件 ├── nuget.config # 私有NuGet源配置 └── build.ps1 # 本地构建脚本关键文件解读docfx.json这是整个文档生成系统的大脑。它定义了metadata: 指定从哪些.csproj项目提取代码注释来生成API参考。build: 指定包含手写文档如src/**/README.md的源文件夹并配置输出目录、模板和站点全局属性。通过巧妙配置可以让每个包的README.md成为该包文档的入口并与自动生成的API参考无缝整合。README.md的双重角色在src/下的每个项目文件夹里README.md不再仅仅是GitHub仓库的首页说明。它被docfx.json识别并作为该包的“概念性文档”主体可以包含概述、安装、快速入门、高级用法等。这实现了“一鱼两吃”一份Markdown文件既服务了代码仓库又服务了最终文档站。流水线文件.github/workflows/*.yml这是自动化的灵魂。通常包含两条流水线CI流水线在向main分支推送或发起PR时触发运行dotnet test、dotnet pack并将生成的.nupkg文件作为构建产物上传供后续CD或手动发布使用。CD流水线在向main分支推送标签如v1.0.0时触发。它首先运行docfx build生成完整的静态网站然后通过Azure/webapps-deploy或Azure/storage-blob-upload等Action将站点内容部署到托管环境。同时这条流水线也可以从构建产物中取出对应的.nupkg自动推送到私有NuGet服务器实现“发布包即发布文档”。注意这套架构的关键在于“约定大于配置”。它要求团队成员遵守既定的项目结构和文档编写规范比如将包文档放在项目根目录的README.md才能最大化地发挥自动化效益。在项目初期需要花些时间统一思想并设置好模板。3. 核心工具链选型与配置详解3.1 文档生成器为什么选择DocFX在.NET生态中可用于生成API文档的工具不止一个。abellobm3681/nuget-docs项目通常以DocFX为核心这是经过深思熟虑的选择。微软官方出品生态融合好DocFX是微软开发的开源工具对.NET项目尤其是新的SDK风格项目的支持最为原生和稳定。它能完美解析C#的XML文档注释///生成结构清晰的API页面。强大的模板系统DocFX支持自定义模板这意味着你可以让生成的文档站完全匹配公司的品牌风格颜色、Logo、布局。templates/目录就是存放这些自定义模板的地方。混合文档支持这是其最大亮点。DocFX可以无缝地将手写的Markdown文档概念、教程、示例和自动生成的API参考文档混合在一起通过一个统一的toc.yml目录文件进行导航组织。这正好契合了“包文档一体化”的需求。静态输出最终生成的是纯HTML、JS、CSS文件可以托管在任何静态网站服务器上部署简单成本低廉访问速度快。对比其他方案Sandcastle曾经是.NET官方文档工具但构建过程复杂、速度慢且对新的.NET版本支持更新不及时。Wyam现为Statiq非常灵活强大但学习曲线相对陡峭需要更多配置来达到与DocFX类似的混合文档效果。Swagger/OpenAPI更适合REST API的交互式文档对于类库的API参考和概念性文档则不是最佳选择。因此选择DocFX是在功能、易用性和社区支持之间的一个最佳平衡点。3.2 私有NuGet源集成内部包管理离不开私有NuGet源。在nuget.config文件中你需要配置至少两个源?xml version1.0 encodingutf-8? configuration packageSources add keynuget.org valuehttps://api.nuget.org/v3/index.json / add keyMyCompany-Private valuehttps://pkgs.mycompany.com/nuget/v3/index.json / !-- 或者使用本地文件共享源 -- !-- add keyMyCompany-Local value\\server\share\NuGetPackages / -- /packageSources activePackageSource add keyAll value(Aggregate source) / /activePackageSource /configuration在CI/CD流水线中当需要推送包时通常使用dotnet nuget push命令并配合认证- name: Push to Private Feed run: | dotnet nuget push **/*.nupkg --source MyCompany-Private --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate这里的secrets.NUGET_API_KEY需要在GitHub仓库的Settings - Secrets中配置对应你私有源如Azure Artifacts生成的个人访问令牌(PAT)。3.3 静态站点托管方案生成的文档站需要托管。有几个高性价比的方案Azure Storage Static Website这是我最推荐的方案之一。成本极低几乎只收存储费用配置简单并且可以绑定自定义域名和SSL证书。CD流水线可以直接用Azure CLI或GitHub Action将文件上传到指定的Blob容器。GitHub Pages完全免费适合开源项目或对访问速度要求不高的内部项目。但要注意如果仓库是私有的则需要升级到GitHub Pro或使用GitHub Enterprise。内部Nginx/Apache服务器对于完全内网的环境可以部署在一台内部服务器上。CD流水线可以通过SSH或FTP将文件同步过去。在docfx.json的build部分你需要指定正确的dest路径以便流水线知道将文件输出到哪里进行后续部署。4. 从零开始搭建的实操步骤假设我们从一个全新的状态开始为团队搭建这套系统。以下步骤基于一个典型的、使用Azure DevOps Services或GitHub和Azure服务的环境。4.1 第一步创建仓库与初始化结构创建主仓库在GitHub或Azure Repos上创建一个新仓库例如命名为company-nuget-docs。克隆到本地并创建基础目录结构mkdir docs src templates .github/workflows初始化全局docfx.json在仓库根目录运行docfx init -q可以生成一个最小配置但为了更贴合我们的需求我建议手动创建一个。下面是一个高度定制化的docfx.json示例核心部分{ metadata: [ { src: [ { files: [ src/**/*.csproj ], exclude: [ **/obj/**, **/bin/** ] } ], dest: api, disableGitFeatures: false, disableDefaultFilter: false } ], build: { content: [ { files: [ api/**.yml, api/index.md ] }, { files: [ docs/**.md, docs/**/toc.yml, src/**/README.md, src/**/api/**.md ], exclude: [ **/obj/**, **/bin/** ] } ], resource: [ { files: [ docs/images/** ] } ], overwrite: [ { files: [ apidoc/**.md ], exclude: [ obj/**, docs/** ] } ], dest: _site, globalMetadata: { _appTitle: 公司内部组件文档中心, _appFooter: © MyCompany. 内部使用。, _enableSearch: true }, template: [ default, ./templates/my-company ] } }这个配置的关键在于build.content部分它明确包含了src/**/README.md确保每个包的专属文档能被抓取。4.2 第二步创建你的第一个内部包及其文档在src/目录下创建一个新的类库项目例如MyCompany.Utility.StringHelper。cd src dotnet new classlib -n MyCompany.Utility.StringHelper完善项目文件.csproj确保开启XML文档生成并添加必要的包信息Project SdkMicrosoft.NET.Sdk PropertyGroup TargetFrameworknet8.0/TargetFramework GenerateDocumentationFiletrue/GenerateDocumentationFile PackageIdMyCompany.Utility.StringHelper/PackageId Version1.0.0/Version AuthorsYour Team/Authors CompanyMyCompany/Company Description一套强大的字符串处理工具集包含模糊匹配、安全格式化等功能。/Description PackageTagsutility;string;internal/PackageTags !-- 重要指定包图标、仓库地址等 -- PackageIconicon.png/PackageIcon RepositoryUrlhttps://github.com/your-company/company-nuget-docs/RepositoryUrl /PropertyGroup ItemGroup None Includeicon.png Packtrue PackagePath\ / /ItemGroup /Project编写代码并添加XML注释这是API文档自动生成的基础。务必为公开的类、方法、属性、参数添加清晰的/// summary注释。创建包专属文档在MyCompany.Utility.StringHelper项目根目录下创建或编辑README.md。这份文档不应只是“这个项目是...”而应是一份完整的用户指南。# MyCompany.Utility.StringHelper 提供高性能、安全的字符串扩展方法。 ## 安装 bash dotnet add package MyCompany.Utility.StringHelper快速开始using MyCompany.Utility.StringHelper; var result Hello World.ToSlug(); // 输出 hello-world var isSafe userInput.IsSafeSqlString(); // 检查SQL注入风险核心功能字符串脱敏MaskSensitiveInfoSlug生成ToSlug安全检测IsSafeSqlString,HasXssRisk高性能拼接JoinWith高级配置某些方法支持通过StringHelperOptions进行配置...版本历史v1.0.0(2023-10-27): 初始版本包含基础工具方法。可选在项目下创建api/目录放置更深入的API详解或教程Markdown文件它们会被docfx.json自动包含。4.3 第三步配置自动化CI/CD流水线这里以GitHub Actions为例。在.github/workflows/下创建两个YAML文件。1. CI流水线 (ci-build-and-pack.yml):name: CI - Build, Test and Pack on: push: branches: [ main, develop ] pull_request: branches: [ main ] jobs: build: runs-on: windows-latest # 或 ubuntu-latest根据项目需要 steps: - uses: actions/checkoutv3 with: fetch-depth: 0 # 获取所有历史DocFX可能需要 - name: Setup .NET uses: actions/setup-dotnetv3 with: dotnet-version: 8.0.x - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --configuration Release --no-restore - name: Test run: dotnet test --configuration Release --no-build --verbosity normal - name: Pack NuGet packages run: dotnet pack --configuration Release --no-build --output ./artifacts - name: Upload build artifacts uses: actions/upload-artifactv3 with: name: nuget-packages path: ./artifacts/*.nupkg这条流水线确保每次合并到主分支的代码都是经过测试并可打包的。2. CD流水线 (cd-deploy-docs-and-push-package.yml):name: CD - Deploy Docs and Push Package on: push: tags: - v* # 仅当推送类似 v1.0.0, v2.1.0-beta 的标签时触发 jobs: deploy: runs-on: ubuntu-latest # 文档生成和部署对系统要求不高Linux更轻量 steps: - uses: actions/checkoutv3 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnetv3 with: dotnet-version: 8.0.x - name: Install DocFX run: dotnet tool install -g docfx - name: Build documentation site run: | docfx docfx.json # 如果使用了自定义模板可能需要先构建模板或复制资源 - name: Deploy to Azure Storage Static Website uses: azure/CLIv1 with: azcliversion: latest inlineScript: | az storage blob upload-batch --account-name ${{ secrets.AZURE_STORAGE_ACCOUNT }} --auth-mode key --account-key ${{ secrets.AZURE_STORAGE_KEY }} --source _site --destination $web --overwrite - name: Push NuGet package to private feed run: | # 首先从CI的构建产物中下载包或者直接在这里打包 dotnet pack --configuration Release --output ./release-packages for f in ./release-packages/*.nupkg; do dotnet nuget push $f --source ${{ secrets.NUGET_FEED_URL }} --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate done这条流水线在打版本标签时触发完成文档生成、站点部署和包推送的一站式操作。实操心得在配置CD流水线时secrets的管理至关重要。AZURE_STORAGE_ACCOUNT、AZURE_STORAGE_KEY、NUGET_FEED_URL、NUGET_API_KEY都必须作为加密机密存储在仓库设置中绝对不要硬编码在YAML文件里。另外打标签发布是一个很好的实践它明确了一个“可发布”的节点并且标签名如v1.0.0可以直接用作包的版本来源。4.4 第四步定制文档站点与导航创建全局导航在docs/目录下创建toc.yml这是整个文档站的菜单。- name: 首页 href: index.md - name: 组件库 href: src/ homepage: src/README.md items: - name: 工具类 href: src/MyCompany.Utility.StringHelper/ homepage: src/MyCompany.Utility.StringHelper/README.md # 未来可以在这里添加更多包... - name: API 参考 href: api/ homepage: api/index.md创建站点首页编辑docs/index.md做一个漂亮的Landing Page介绍这个文档中心的目的、如何快速找到需要的包、如何贡献等。自定义模板如果你对默认的DocFX主题不满意可以基于默认模板创建自定义版本。复制[DocFX安装目录]\templates\default到项目的templates/my-company目录然后修改其中的.cshtml、css、js文件。在docfx.json中通过template: [default, ./templates/my-company]引用即可。你可以在这里添加公司Logo、修改颜色主题、增加统一的页眉页脚等。5. 高级技巧与最佳实践5.1 多版本文档管理当你的包发布多个主要版本如v1.x和v2.x且不兼容时可能需要同时维护多个版本的文档。DocFX本身支持通过version配置进行多版本构建。一个常见的做法是为每个主要版本创建一个对应的Git分支如release/1.x,release/2.x。在CD流水线中根据当前构建的标签或分支将生成的文档输出到以版本号命名的子目录例如_site/v1/,_site/v2/。在静态站点托管时配置一个入口页面如index.html让用户选择要查看的版本。或者使用更高级的托管服务如Azure Static Web Apps的路由规则来实现版本切换。这需要更复杂的docfx.json配置和流水线逻辑但对于提供长期支持的库来说非常有必要。5.2 包依赖图的自动生成一个内部生态系统中包之间常有依赖关系。在文档中心可视化这些依赖能帮助开发者理解架构。你可以通过以下步骤实现在CI流水线中在dotnet pack之后运行一个自定义脚本可以用PowerShell或Python解析所有.csproj文件提取PackageReference和ProjectReference信息生成一个结构化的JSON文件如dependencies.json。将这个JSON文件作为资源包含在文档构建中在docfx.json的build.resource里配置。在前端模板templates/下的.cshtml或.js文件中使用D3.js或vis.js等库读取这个JSON文件渲染出交互式的依赖关系图。这能为你的文档中心增加一个非常专业的架构视图功能。5.3 文档质量门禁为了防止提交低质量或空白的文档可以在CI流水线中集成简单的文档检查基础检查写一个脚本检查src/**/README.md文件是否存在以及文件大小是否大于某个阈值例如不能少于500字节避免空文档。链接检查使用像markdown-link-check这样的工具在构建文档前检查所有Markdown文件中的内部和外部链接是否有效避免出现死链。拼写与语法建议可以集成像cspellCode Spell Checker这样的工具对文档中的英文单词进行拼写检查。这些检查可以作为PR流水线中的一个环节如果失败则阻止合并从而在源头提升文档质量。6. 常见问题与排查实录在实际推行这套系统的过程中我和团队遇到过不少问题。这里把一些典型问题和解决方案记录下来希望能帮你避坑。6.1 问题DocFX构建失败报错“无效的交叉引用”现象流水线中docfx build命令失败错误信息指向某个Markdown文件中的链接[某个类](xref:MyCompany.Utility.SomeClass)无法解析。原因这是最常见的问题。xref是DocFX中用于链接到API文档的特殊语法。报错意味着DocFX在生成的元数据中找不到MyCompany.Utility.SomeClass这个类。可能的原因有类名写错了大小写、命名空间。该类所在的程序集没有被docfx.json中的metadata部分正确包含例如对应的.csproj文件被exclude规则过滤了。该类不是public的因此没有生成API元数据。在构建文档时对应的项目还没有成功编译生成XML文档文件。解决方案仔细检查拼写确保xref链接中的全限定名完全正确。检查docfx.json配置确认metadata.src.files模式能匹配到所有需要生成API的项目文件。可以临时运行docfx metadata docfx.json来单独生成元数据并查看输出目录下的.yml文件确认目标类是否存在。检查类可见性确保你想要引用的类、方法等是public的。确保构建顺序在流水线中docfx build步骤之前必须先有dotnet build步骤以确保XML文档文件已生成。6.2 问题生成的文档站点样式混乱或功能缺失现象部署后的网站没有样式或者搜索功能不能用。原因通常是静态资源CSS, JS加载路径错误或者DocFX的模板资源没有正确复制到输出目录。解决方案检查控制台网络请求在浏览器中打开开发者工具查看加载失败的资源404错误。确认其请求路径。检查docfx.json的dest和basePath如果你将站点部署到子路径如https://docs.mycompany.com/nuget/则需要在docfx.json的build.globalMetadata中设置_basePath: /nuget/这样所有资源引用都会基于此路径。检查自定义模板如果你使用了自定义模板确保模板中的所有资源文件如图片、CSS都被正确引用并且通过build.resource配置将其复制到了输出目录。使用绝对路径引用资源在模板中对于CSS、JS的引用建议使用~前缀DocFX支持的语法或基于站点根目录的绝对路径。6.3 问题内部NuGet包推送失败认证错误现象CD流水线中dotnet nuget push步骤失败返回401或403错误。原因访问私有NuGet源的认证信息不正确或已过期。解决方案检查密钥Secret首先确认在GitHub仓库的Secrets中NUGET_API_KEY的值是正确的。对于Azure Artifacts这个密钥是一个具有“打包Packaging”范围读写权限的个人访问令牌(PAT)。检查源URL确认NUGET_FEED_URL配置的源地址完全正确包括/v3/index.json部分。令牌过期PAT通常有有效期默认最长1年。定期检查并更新过期的密钥。测试本地推送在本地机器上尝试使用相同的源和密钥手动推送一个测试包以排除流水线环境本身的问题。命令如dotnet nuget push package.1.0.0.nupkg --source YOUR_FEED_URL --api-key YOUR_PAT6.4 问题文档更新了但网站内容还是旧的现象合并了文档修改的PR并触发了CD流水线但访问网站发现内容未变。原因静态站点托管服务的缓存机制在“作祟”。Azure Storage Static Website、GitHub Pages或CDN服务为了性能会缓存HTML、CSS、JS文件。解决方案强制覆盖上传确保你的部署脚本如az storage blob upload-batch使用了--overwrite参数。缓存清除Azure Storage本身缓存策略不强主要是浏览器缓存。可以尝试在文件名中加入哈希一些静态站点生成器会自动做但DocFX默认不提供此功能。更简单的方式是在用户访问时引导他们按CtrlF5强制刷新。CDN如果你在前面接了CDN如Azure CDN需要在CDN管理端执行“清除缓存”操作或者配置更短的缓存过期时间。验证部署日志仔细查看CD流水线的执行日志确认docfx build步骤成功执行并且文件确实被上传到了正确的位置。有时可能是部署步骤本身失败了但被忽略。推行abellobm3681/nuget-docs这类项目技术实现只是一半另一半是团队习惯的培养。一开始可能需要强制要求在Code Review中把文档更新作为硬性条件。但一旦大家体会到“查找文档如此方便”、“再也不用到处问人”的好处后它就会从一项任务变成一种自然的工作流程。我们团队在实施半年后新成员上手内部工具的效率提升了至少50%因为他们的第一反应不再是找人问而是去文档中心自己找答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2618125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…