2

我已经为repo编写了一个清单 XML 文件(或 git-repo、Gerrit Repo、Google 的 Repo,具体取决于您喜欢如何命名)。为了帮助检查我的语法,我尝试根据repo Manifest Format text document生成一个文档类型定义 (DTD) 文件以配合它。当我在清单 XML 文件中包含<!DOCTYPE manifest SYSTEM "manifest.dtd">一行时,repo 默默地无法拉入存储库。

是否可以在 Repo 清单 XML 文件中包含对 DTD 的 DOCTYPE 引用并让 repo 仍然有效?

真的,我正在检查我是否可能在我的语法中做错了什么,或者 repo 在其 XML 解析能力方面有一些限制。在没有其他更改的情况下,我编写的清单 wot 在省略 DOCTYPE 行时有效。

我相对确信 XML 和 DTD 语法是正确的,因为xmllint当存在 DOCTYPE 行时我可以调用文件并看到它根据 DTD 验证 XML。当我第一次运行 lint 循环时,它发现了几个错别字,这正是我希望通过定义 DTD 文件来做的事情。

这是有问题的DTD文件:

<!ELEMENT manifest (notice?,
                    remote*,
                    default?,
                    manifest-server?,
                    remove-project*,
                    project*,
                    extend-project*,
                    repo-hooks?,
                    include*)>

<!ELEMENT notice (#PCDATA)>

<!ELEMENT remote EMPTY>
    <!ATTLIST remote name         ID    #REQUIRED>
    <!ATTLIST remote alias        CDATA #IMPLIED>
    <!ATTLIST remote fetch        CDATA #REQUIRED>
    <!ATTLIST remote pushurl      CDATA #IMPLIED>
    <!ATTLIST remote review       CDATA #IMPLIED>
    <!ATTLIST remote revision     CDATA #IMPLIED>

<!ELEMENT default EMPTY>
    <!ATTLIST default remote      IDREF #IMPLIED>
    <!ATTLIST default revision    CDATA #IMPLIED>
    <!ATTLIST default dest-branch CDATA #IMPLIED>
    <!ATTLIST default sync-j      CDATA #IMPLIED>
    <!ATTLIST default sync-c      CDATA #IMPLIED>
    <!ATTLIST default sync-s      CDATA #IMPLIED>

<!ELEMENT manifest-server EMPTY>
    <!ATTLIST manifest-server url CDATA #REQUIRED>

<!ELEMENT project (annotation*,
                   project*,
                   copyfile*,
                   linkfile*)>
    <!ATTLIST project name        CDATA #REQUIRED>
    <!ATTLIST project path        CDATA #IMPLIED>
    <!ATTLIST project remote      IDREF #IMPLIED>
    <!ATTLIST project revision    CDATA #IMPLIED>
    <!ATTLIST project dest-branch CDATA #IMPLIED>
    <!ATTLIST project groups      CDATA #IMPLIED>
    <!ATTLIST project sync-c      CDATA #IMPLIED>
    <!ATTLIST project sync-s      CDATA #IMPLIED>
    <!ATTLIST project upstream    CDATA #IMPLIED>
    <!ATTLIST project clone-depth CDATA #IMPLIED>
    <!ATTLIST project force-path  CDATA #IMPLIED>

<!ELEMENT annotation EMPTY>
    <!ATTLIST annotation name  CDATA #REQUIRED>
    <!ATTLIST annotation value CDATA #REQUIRED>
    <!ATTLIST annotation keep  CDATA "true">

<!ELEMENT copyfile EMPTY>
    <!ATTLIST copyfile src  CDATA #REQUIRED>
    <!ATTLIST copyfile dest CDATA #REQUIRED>

<!ELEMENT linkfile EMPTY>
    <!ATTLIST linkfile src  CDATA #REQUIRED>
    <!ATTLIST linkfile dest CDATA #REQUIRED>

<!ELEMENT extend-project EMPTY>
    <!ATTLIST extend-project name   CDATA #REQUIRED>
    <!ATTLIST extend-project path   CDATA #IMPLIED>
    <!ATTLIST extend-project groups CDATA #IMPLIED>

<!ELEMENT remove-project EMPTY>
    <!ATTLIST remove-project name  CDATA #REQUIRED>

<!ELEMENT repo-hooks EMPTY>
    <!ATTLIST repo-hooks in-project   CDATA #REQUIRED>
    <!ATTLIST repo-hooks enabled-list CDATA #REQUIRED>

<!ELEMENT include EMPTY>
    <!ATTLIST include name CDATA #REQUIRED>

我正在为 Yocto 工作区编写清单,因此最小的演示 manifest.xml 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest SYSTEM "manifest.dtd">
<manifest>
  <remote name="yoctop" fetch="git://git.yoctoproject.org/"/>
  <remote name="oe" fetch="git://github.com/openembedded"/>
  <default sync-j="4" revision="krogoth"/>
  <project name="poky" remote="yoctop" path="./"/>
  <project name="meta-openembedded" remote="oe" path="meta-openembedded"/>
</manifest>

使用 DOCTYPE 行后,我发现 repo 版本 v1.12.37 在其启动和后续同步中静默失败。如果没有 DOCTYPE 行,您将获得一个基本的 Yocto 工作区设置。

您需要将清单提交到 Git 存储库,以便 repo 乐于使用它。

4

0 回答 0