Можно ли включить ссылку DOCTYPE на DTD внутри XML-файла манифеста Repo?
Я написал XML-файл манифеста для репо (или git-repo, Gerrit Repo, Google Repo, в зависимости от того, как вы хотите его назвать). Чтобы проверить мой синтаксис, я попытался сгенерировать файл определения типа документа (DTD), чтобы он соответствовал текстовому документу формата манифеста репо. Когда я включаю <!DOCTYPE manifest SYSTEM "manifest.dtd">
В моем XML-файле манифеста репо молча не может получить данные из репозиториев.
Можно ли включить ссылку DOCTYPE на DTD внутри XML-файла манифеста Repo, и репо все еще работает?
На самом деле я проверяю, возможно, я что-то сделал неправильно в моем синтаксисе, или репо имеет некоторые ограничения в своих возможностях синтаксического анализа XML. Без других изменений манифест, который я написал, работает, когда строка DOCTYPE опущена.
Я относительно уверен, что синтаксис XML и DTD правильный, как я могу назвать xmllint
в файле, когда присутствует строка DOCTYPE, и посмотрите, как он проверяет XML на соответствие DTD. Когда я впервые запустил цикл 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, я обнаружил, что версия репозитория v1.12.37 молча дает сбой при инициации и последующей синхронизации. Без линии DOCTYPE вы получаете базовую рабочую область Yocto.
Для того, чтобы репо было счастливым, вам нужно иметь манифест в репозитории Git.