为 CTAN 准备文件(在 Windows 系统上)的最佳实践(技术上)

为 CTAN 准备文件(在 Windows 系统上)的最佳实践(技术上)

以前有人问过类似的问题,但我没有找到针对最近发现的问题的问题。

我想要做的是将包上传到 CTAN技术状态良好。我在使用之前这样做过http://tug.org/texlive/pkgcontrib.html

  1. 我创建了一个包含所有文件的平面目录。

  2. 我创建了一个 TDS 目录结构,将文件保存在预期位置。

  3. 我压缩了 TDS 结构。

  4. 我将平面目录和.tds.zipZIP 文件压缩为一个包。

  5. 我将包 ZIP 文件连同附带信息一起上传到了 CTAN。

到目前为止一切顺利。我的本意是尽可能少地给 CTAN 团队安装我的软件包带来麻烦。

最近,我发现我天真地以为他们只是解压我的包,其实不然。他们会处理我上传的文件,有时还会手动修复问题。这不是我想要的。

现在来回答这个问题:

作者应该尊重哪些(未透露的)技术细节,以使 CTAN 团队的工作更轻松?

我知道一个 Perl 脚本ctanify,它可能在 Linux 系统上自动完成所有操作(但对于 Windows 则不然,正如文档所述 (?))。除此之外,我想知道(并消除)问题的技术原因。

一些需要纠正的事情似乎出现在 Windows 系统上准备文件中 - 我把它放在了问题的标题中。

据我所知,情况如下:

(A)Windows 系统上的文本文件以 CRLF(十六进制:0D0A)结尾,而 Unix 系统仅使用 LF(十六进制:0A)。我看到 CTAN 过滤上传的文本文件,将 CRLF 替换为 LF。如果不清楚哪个文件实际上是文本文件,这会导致工作量增加,甚至出现问题。我可以自己给出以下答案:压缩前将 CRLF 替换为 LF

(二)拉上拉链就是拉上拉链(?)——还是不是?好的坏的为 CTAN 制作 ZIP 文件?如何制作好的ZIP 文件(在 Windows 上)系统。我知道答案将取决于工具,但是对于 CTAN 是否有一些需要考虑的一般提示?

编辑:例如,Apache Ant 1.9.2 基于 Java 的 zipper 生成坏的ZIP 文件。从 CTAN,我得到了以下报告:

,-----[ tds_fault_finder ]------------------------------------------------
|  WARNING: tcolorbox.tds.zip: Bad zipper?  No file is labelled as text by zipinfo
`-------------------------------------------------------------------------

据推测,这是因为此 zipper 没有设置某些“文本与二进制”标志。据 CTAN 称,它们收到好的Windows 系统中的 ZIP 文件。因此,这部分问题可以表述为:什么是好的zipper 工具 (适用于 Windows)?

编辑2:根据给出的答案和一些进一步的研究,简短的答案似乎是:一切基于信息ZIP好的CTAN 上传的 zipper。找到 Info-Zip 的 Windows 二进制文件这里;查看其他答案好的拉链。

(还要别的吗)CTAN 团队还做了哪些工作来处理作者可以避免的上传文件?

答案1

我使用 Info-ZIP 作为Windows 上的 Gnu适用于我在 Windows 上创建的 zip 文件。(直接从信息ZIP也可以,不过需要手动安装到路径。

为了顺利完成构建,我使用批处理文件(make.bat,因此我只make ctan在 Windows 和 Unix 上使用)。例如,我在 Windows 上使用的脚本siunitx是:

@echo off

  if not "%1" == "" goto :init

:help

  echo.
  echo  make clean        - delete all generated files
  echo  make ctan         - create an archive ready for CTAN
  echo  make doc          - typesets documentation
  echo  make localinstall - extract packages
  echo  make tds          - create a TDS-ready archive
  echo  make unpack       - extract packages

  goto :EOF

:init

  setlocal

  rem The name of the package to create should be set here: here, the
  rem example package "testpkg" is in use

  set PACKAGE=siunitx

  rem It is possible to unpack dtx files without needing any extra files, but
  rem some people prefer a separate ins file (or there may be no unpacking
  rem to do). This should be set up here: for a self-extracting dtx the
  rem standard setting is fine.

  set UNPACK=%PACKAGE%.dtx

  rem A list of pdf files to be typeset and included in the archive files
  rem created. The files named here will be typeset (looking for source files
  rem in the order .dtx, .tex, .ltx).

  set INCLUDEPDF=%PACKAGE%

  rem Plain text files to be included in the archives: the .txt extension is
  rem automatically stripped when creating the archive.

  set INCLUDETXT=README

  rem Files to typeset

  rem The settings for cleaning up after compilation are divided into two
  rem parts. AUXFILES are deleted after each (La)TeX run, CLEAN only
  rem when the user calls "make clean"

  set AUXFILES=aux bbl blg cmds dvi glo gls hd idx ilg ind ist log los out tmp toc
  set CLEAN=bib bst cfg cls eps gz ins pdf sty tex txt zip

  rem Sets the order for searching for source files for pdfs

  set PDFSOURCES=dtx

  rem The file types for inclusion in the archive files: note that a CTAN
  rem archive should not contain "unpacked" files. Typeset files and their
  rem sources are not inlcuded here: they are dealt with separately

  set CTANFILES=dtx ins pdf
  set TDSFILES=%CTANFILES% cfg sty 

  rem Locations for building archives

  set CTANROOT=ctan
  set CTANDIR=%CTANROOT%\%PACKAGE%
  set TDSROOT=tds

  cd /d "%~dp0"

:main

  if /i "%1" == "clean"        goto :clean
  if /i "%1" == "ctan"         goto :ctan
  if /i "%1" == "doc"          goto :doc
  if /i "%1" == "help"         goto :help
  if /i "%1" == "localinstall" goto :localinstall
  if /i "%1" == "tds"          goto :tds
  if /i "%1" == "unpack"       goto :unpack

  goto :help

:clean

  echo.
  echo Deleting files

  for %%I in (%CLEAN%) do (
    if exist *.%%I del /q *.%%I
  )

  for %%I in (%TXT%) do (
    if exist %%I del /q %%I
  )

:clean-aux

  for %%I in (%AUXFILES%) do (
    if exist *.%%I del /q *.%%I
  )

  goto :end

:ctan

  call :zip
  if errorlevel 1 goto :EOF

  call :tds
  if errorlevel 1 goto :EOF

  for %%I in (%SOURCES%) do (
    xcopy /q /y %%I "%CTANDIR%\" > nul
  )  
  for %%I in (%CTANFILES%) do (
    xcopy /q /y *.%%I "%CTANDIR%\" > nul
  )
  for %%I in (%INCLUDETXT%) do (
    xcopy /q /y %%I.txt "%CTANDIR%\" > nul
    ren "%CTANDIR%\%%I.txt" %%I
  )

  xcopy /q /y %PACKAGE%.tds.zip "%CTANROOT%\" > nul

  pushd "%CTANROOT%"
  %ZIPEXE% %ZIPFLAG% %PACKAGE%.zip .
  popd
  copy /y "%CTANROOT%\%PACKAGE%.zip" > nul

  rmdir /s /q %CTANROOT%

  goto :end

:doc 

  call :unpack

  set SOURCES=

  for %%I in (%INCLUDEPDF%) do (
    for %%J in (%PDFSOURCES%) do (
      echo.
      if exist %%I.%%J call :typeset-%%J %%I.%%J
    )
  )

  goto :clean-aux

:file2tdsdir

  set TDSDIR=

  if /i "%~x1" == ".cfg" set TDSDIR=tex\latex\%PACKAGE%\config
  if /i "%~x1" == ".dtx" set TDSDIR=source\latex\%PACKAGE%
  if /i "%~x1" == ".ins" set TDSDIR=source\latex\%PACKAGE%
  if /i "%~x1" == ".pdf" set TDSDIR=doc\latex\%PACKAGE%
  if /i "%~x1" == ".sty" set TDSDIR=tex\latex\%PACKAGE%
  if /i "%~x1" == ".tex" set TDSDIR=doc\latex\%PACKAGE%  
  if /i "%~x1" == ".txt" set TDSDIR=doc\latex\%PACKAGE%

  goto :EOF

:localinstall

  call :unpack

  echo.
  echo Installing

  if not defined TEXMFHOME set TEXMFHOME=%USERPROFILE%\texmf

  for %%I in (%TDSFILES%) do (
    call :localinstall-int *.%%I
  )

  goto :end

:localinstall-int

  call :file2tdsdir %1

  if defined TDSDIR (
    xcopy /q /y %1 "%TEXMFHOME%\%TDSDIR%\" > nul
  ) else (
    echo Unknown file type "%~x1"
  )

  goto :EOF

:tds

  call :zip
  if errorlevel 1 goto :EOF

  call :doc
  if errorlevel 1 goto :EOF

  echo.
  echo Creating archive

  for %%I in (%SOURCES%) do (
    call :tds-int %%I
  )
  for %%I in (%TDSFILES%) do (
    call :tds-int *.%%I
  )
  for %%I in (%INCLUDETXT%) do (
    xcopy /q /y %%I.txt "%TDSROOT%\doc\latex\%PACKAGE%\" > nul
    ren "%TDSROOT%\doc\latex\%PACKAGE%\%%I.txt" %%I
  )

  pushd "%TDSROOT%"
  %ZIPEXE% %ZIPFLAG% %PACKAGE%.tds.zip .
  popd
  copy /y "%TDSROOT%\%PACKAGE%.tds.zip" > nul

  rmdir /s /q "%TDSROOT%"

  goto :end

:tds-int

  call :file2tdsdir %1

  if defined TDSDIR (
    xcopy /q /y %1 "%TDSROOT%\%TDSDIR%\" > nul
  ) else (
    echo Unknown file type "%~x1"
  )

  goto :EOF

:typeset-dtx

  echo Typesetting %1

  pdflatex -draftmode -interaction=nonstopmode "\AtBeginDocument{\DisableImplementation} \input %1" > nul
  if ERRORLEVEL 1 (
    echo ! Compilation failed
  ) else (
    makeindex -q -s gglo.ist -o %~n1.gls %~n1.glo > nul
    makeindex -q -s gind.ist -o %~n1.ind %~n1.idx > nul
    pdflatex -interaction=nonstopmode "\AtBeginDocument{\DisableImplementation} \input %1" > nul
    makeindex -q -s gind.ist -o %~n1.ind %~n1.idx > nul
    pdflatex -interaction=nonstopmode "\AtBeginDocument{\DisableImplementation} \input %1" > nul 
  )

  goto :EOF

:typeset-tex

  echo Typesetting %1

  set SOURCES=%SOURCES% %1

  pdflatex -interaction=nonstopmode -draftmode %1 > nul
  if ERRORLEVEL 1 (
    echo ! Compilation failed
  )
  pdflatex -interaction=nonstopmode %1 > nul
  pdflatex -interaction=nonstopmode %1 > nul

  goto :EOF

:unpack

  echo.
  echo Unpacking files

  for %%I in (%UNPACK%) do (
    tex %%I > nul
  )

  goto :end

:zip 

  if not defined ZIPFLAG set ZIPFLAG=-r -q -X -ll

  if defined ZIPEXE goto :EOF

  for %%I in (zip.exe "%~dp0zip.exe") do (
    if not defined ZIPEXE if exist %%I set ZIPEXE=%%I
  )

  for %%I in (zip.exe) do (
    if not defined ZIPEXE set ZIPEXE="%%~$PATH:I"
  )

  if not defined ZIPEXE (
    echo.
    echo This procedure requires a zip program,
    echo but one could not be found.
    echo
    echo If you do have a command-line zip program installed,
    echo set ZIPEXE to the full executable path and ZIPFLAG to the
    echo appropriate flag to create an archive.
    echo.
  )

  goto :EOF

:end

  shift
  if not "%1" == "" goto :main

这是为了尽可能地“便携”而设置的,但 zip 操作归结为

zip -r -q -X -ll

在一个布局合适的文件夹中。您会注意到,我使用 Info-ZIP 来处理行尾,因此我从未更改过工作文件中的内容。到目前为止,我还没有遇到过使用上述设置的 CTAN 团队遇到的问题(该设置经过了数年的改进)。

答案2

我曾经在使用 7zip 时遇到过同样的问题。然后我决定bash在环境中编写自己的脚本cygwin并使用提供的脚本zip!从此再也没有问题了。

对于 Windows,我猜是使用一个非常古老的简单方法zip.exe,如所述这里。 或许Windows 版 Gzip是一个很好的测试候选人。

对于你的其他问题,我正在使用类似

find ./$CTANDIR -name \* -exec dos2unix -k -q {} \;
find ./$CTANDIR -type d -exec chmod 755 '{}' \;
find ./$CTANDIR -type f -exec chmod 644 '{}' \;

获取具有LF行尾和合理权限的文件。否则,默认情况下对文件cgywin使用 zip700 。Windows

编辑:

Info-ZIP 的 zip 版本似乎是一个不错的选择。我的工作cygwin流程使用:

$ zip -v
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Cygwin. Original by Info-ZIP.
Currently maintained by E. Gordon.  Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.

Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip,
as of above date; see http://www.info-zip.org/ for other sites.

相关内容