데비안 패키지를 분할합니다. 그들의 관계는 어떤 모습이어야 할까요?

데비안 패키지를 분할합니다. 그들의 관계는 어떤 모습이어야 할까요?

패키지 와 .foo/usr/lib/libfoo1.so/usr/lib/libfoo2.so

foo두 개의 패키지, foo1즉 및 로 분할하고 싶지만 foo2올바른 관계를 파악할 수 없습니다. 내 생각엔 내가 원하는 것 같아전체 패키지를 교체하여 강제로 제거합니다., 그러나 이는 패키지 이름을 바꿀 때만 작동하는 것 같습니다(분할하지 않음).


내 테스트는 다음과 같습니다 debian/control.

Source: libfoo
Maintainer: Stewart <[email protected]>
Build-Depends: debhelper-compat (= 11)

Package: foo
Architecture: all
Description: Old package

Package: foo1
Architecture: all
Conflicts: foo
Replaces: foo
Provides: foo

Package: foo2
Architecture: all
Conflicts: foo
Replaces: foo
Provides: foo

Package: bar
Architecture: all
Depends: foo
Description: Old rdepends, don't want this breaking

Package: baz
Architecture: all
Depends: foo1, foo2
Description: New rdepends, this needs to work too

그런 다음 다음을 테스트해 보세요.

dpkg-buildpackage

# Set up an existing system
sudo dpkg -i ../foo_1.0.0_all.deb ../bar_1.0.0_all.deb

# Simulate what will happen during upgrade
sudo dpkg -i ../baz_1.0.0_all.deb ../foo1_1.0.0_all.deb ../foo2_1.0.0_all.deb

나는 설치, 제거 및 둘 다 만족스러운 상황을 얻으 foo1려고 foo2노력 foo하고 bar있습니다 baz.


상황 {Conflicts,Replaces,Provides}: foo결과:

$ sudo dpkg -i ../foo1_1.0.0_all.deb ../foo2_1.0.0_all.deb ../baz_1.0.0_all.deb 
dpkg: regarding ../foo1_1.0.0_all.deb containing foo1:
 foo1 breaks foo
  foo (version 1.0.0) is present and installed.

dpkg: error processing archive ../foo1_1.0.0_all.deb (--install):
 installing foo1 would break foo, and
 deconfiguration is not permitted (--auto-deconfigure might help)
dpkg: regarding ../foo2_1.0.0_all.deb containing foo2:
 foo2 breaks foo
  foo (version 1.0.0) is present and installed.

dpkg: error processing archive ../foo2_1.0.0_all.deb (--install):
 installing foo2 would break foo, and
 deconfiguration is not permitted (--auto-deconfigure might help)
Preparing to unpack ../baz_1.0.0_all.deb ...
Unpacking baz (1.0.0) over (1.0.0) ...
dpkg: dependency problems prevent configuration of baz:
 baz depends on foo1; however:
  Package foo1 is not installed.
 baz depends on foo2; however:
  Package foo2 is not installed.

dpkg: error processing package baz (--install):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 ../foo1_1.0.0_all.deb
 ../foo2_1.0.0_all.deb
 baz


내가 얻을 수 있는 가장 가까운 것은 {Conflicts,Replaces,Provides}:foo2가 아닌 foo1을 설정하는 것입니다. 이는 다음을 제공합니다:

$ sudo dpkg -i ../foo1_1.0.0_all.deb ../foo2_1.0.0_all.deb ../baz_1.0.0_all.deb 
Selecting previously unselected package baz.
(Reading database ... 538326 files and directories currently installed.)
Preparing to unpack ../baz_1.0.0_all.deb ...
Unpacking baz (1.0.0) ...
Selecting previously unselected package foo1.
dpkg: considering removing foo in favour of foo1 ...
dpkg: yes, will remove foo in favour of foo1
Preparing to unpack ../foo1_1.0.0_all.deb ...
Unpacking foo1 (1.0.0) ...
Selecting previously unselected package foo2.
Preparing to unpack ../foo2_1.0.0_all.deb ...
Unpacking foo2 (1.0.0) ...
Setting up foo1 (1.0.0) ...
Setting up foo2 (1.0.0) ...
Setting up baz (1.0.0) ...

답변1

이것데비안 정책foo로 구분된 예가 제공됩니다 . 이것이 여기에 적용되는 것입니다.foofoo-data

실제로 예상되는 패키지 foo로 교체 하면 안 됩니다 . and 에 추가하면 어느 bar든 만족하게 되고 , 실제로 bar는 or의 내용 에 따라 달라질 수 있지만 , 이는 임의적인 것이 아니기 Provides:때문입니다 . 따라서 만족스럽다는 것은 AND 가 필요하다는 것을 의미합니다 . 다음과 같은 상황에서만 이 작업을 수행할 수 있습니다 .Provides: foofoo1foo2barfoo1foo2foofoo1foo2foo Depends: foo1, foo2

따라서 초기 제어 파일은 다음과 같아야 합니다.

Source: libfoo
Maintainer: Stewart <[email protected]>
Build-Depends: debhelper-compat (= 11)

Package: foo
Architecture: all

Package: bar
Architecture: all
Depends: foo

여기에서 dpkg -i foo_1.0.0_all.deb bar_1.0.0_all.deb초기 조건 설정을 시작하세요 . 그런 다음 제어 파일을 다음으로 변경합니다.

Source: libfoo
Maintainer: Stewart <[email protected]>
Build-Depends: debhelper-compat (= 11)

Package: foo
Architecture: all
Depends: foo1, foo2

Package: foo1
Architecture: all
Breaks: foo (<< 1.1)
Replaces: foo (<< 1.1)

Package: foo2
Architecture: all
Breaks: foo (<< 1.1)
Replaces: foo (<< 1.1)

Package: baz
Architecture: all
Depends: foo1, foo2

foo그런 다음 이것을 빌드하면 , , , , 및 을 설치/업그레이드할 때 모두 올바르게 설치되고 중단되지 않는다는 것을 알 수 있습니다 .foo1foo2bazbar

관련 정보