2017-05-31 110 views
0

我想创建一个包含完整Miniconda安装的tar.gz文件,其中包括一些可以将其分发到脱机机器的软件包。这个tar.gz将与RPM一起安装。重新分配完整的Conda安装

我试图收拾一切做:

sudo sh miniconda.sh -b -p /opt/miniconda 
sudo /opt/miniconda/bin/conda create -p /opt/miniconda/envs --file packages.txt 
tar -czf miniconda.tar.gz /opt/miniconda 

然后,我创建提取所有内容的.spec文件。这是的rpmbuild目录的结构:

[[email protected] rpmbuild]$ tree -L 5 
. 
├── BUILD 
├── BUILDROOT 
├── RPMS 
│   └── x86_64 
│    └── foo-1.0-1.x86_64.rpm 
├── SOURCES 
│   ├── foo-1.0 
│   │   └── opt 
│   │    └── miniconda 
│   │     ├── bin 
│   │     ├── conda-meta 
│   │     ├── envs 
│   │     ├── etc 
│   │     ├── include 
│   │     ├── lib 
│   │     ├── LICENSE.txt 
│   │     ├── pkgs 
│   │     ├── share 
│   │     └── ssl 
│   └── foo-1.0.tar.gz 
├── SPECS 
│   └── foo.spec 
└── SRPMS 
    └── foo-1.0-1.src.rpm 

的.spec文件

%define  __spec_install_post %{nil} 
%define   debug_package %{nil} 
%define  __os_install_post %{_dbpath}/brp-compress 

Summary: Trying to distribute miniconda 
Name: foo 
Version: 1.0 
Release: 1 
License: GPL+ 
Group: Development/Tools 
SOURCE0 : %{name}-%{version}.tar.gz 
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root 

%description 
"Here's the description" 

%prep 
%setup -q 

%build 
# Nothing 

%install 
rm -rf %{buildroot} 
mkdir -p %{buildroot} 
cp -a * %{buildroot} 

%clean 
rm -rf %{buildroot} 

%files 
%defattr(-,root,root,-) 
/opt/miniconda 

%changelog 

,当我尝试安装RPM,它失败:

[[email protected] rpmbuild]$ sudo yum localinstall ./RPMS/x86_64/foo-1.0-1.x86_64.rpm 
[sudo] password for user: 
Loaded plugins: langpacks, product-id, rhnplugin, search-disabled-repos, subscription-manager 
This system is receiving updates from RHN Classic or Red Hat Satellite. 
Examining ./RPMS/x86_64/foo-1.0-1.x86_64.rpm: foo-1.0-1.x86_64 
Marking ./RPMS/x86_64/foo-1.0-1.x86_64.rpm to be installed 
Resolving Dependencies 
--> Running transaction check 
---> Package foo.x86_64 0:1.0-1 will be installed 
--> Processing Dependency: /opt/anaconda1anaconda2anaconda3/bin/python for package: foo-1.0-1.x86_64 


One of the configured repositories failed (Unknown), 
and yum doesn't have enough cached data to continue. At this point the only 
safe thing yum can do is fail. There are a few ways to work "fix" this: 

    1. Contact the upstream for the repository and get them to fix the problem. 

    2. Reconfigure the baseurl/etc. for the repository, to point to a working 
     upstream. This is most often useful if you are using a newer 
     distribution release than is supported by the repository (and the 
     packages for the previous distribution release still work). 

    3. Run the command with the repository temporarily disabled 
      yum --disablerepo=<repoid> ... 

    4. Disable the repository permanently, so yum won't use it by default. Yum 
     will then just ignore the repository until you permanently enable it 
     again or use --enablerepo for temporary usage: 

      yum-config-manager --disable <repoid> 
     or 
      subscription-manager repos --disable=<repoid> 

    5. Configure the failing repository to be skipped, if it is unavailable. 
     Note that yum will try to contact the repo. when it runs most commands, 
     so will have to try and fail each time (and thus. yum will be be much 
     slower). If it is a very temporary problem though, this is often a nice 
     compromise: 

      yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true 

Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again 

回答

0

我能做到这一点。 这是我的.spec文件

%define  __spec_install_post %{nil} 
%define   debug_package %{nil} 
%define  __os_install_post %{_dbpath}/brp-compress 

%define tarversion foo-1.0 
%define tarfile %{tarversion}.tar.gz 
%define installscript install.sh 

Summary: Trying to distribute miniconda 
Name: foo 
Version: 1.0 
Release: 1 
License: GPL+ 
Group: Development/Tools 
SOURCE1 : %{name}-%{version}.tar.gz 
SOURCE2 : %{installscript} 
BuildRoot: %{_builddir}/%{name}-root 

%description 
%{summary} 

%prep 

%build 
# Nothing 

%install 

mkdir -p %{buildroot}%{_bindir} 
cp -a %{SOURCE1} %{SOURCE2} %{buildroot}%{_bindir}/ 
chmod a+x %{buildroot}%{_bindir}/%{installscript} 

%clean 
rm -rf %{buildroot} 

%files 
%{_bindir}/%{installscript} 
%{_bindir}/%{tarfile} 

%pre 
echo "Deleting old miniconda installation..." 
rm -rf /opt/miniconda 

%preun 
echo "Deleting old miniconda installation..." 
rm -rf /opt/miniconda 

%post 
%{_bindir}/%{installscript} 
rm -rf /tmp/dependencies 
rm /tmp/miniconda.sh 
rm /tmp/packages.txt 

if [ -f /opt/miniconda/bin/python ]; then 
    echo "Python is there!" 
    echo "Checking version..." 

    python_version="$(/opt/miniconda/bin/python --version)" 
    if [[ "3.6.0" =~ "$python_version" ]]; then 
     echo "Python version is correct: $python_version" 
    else 
     echo "ERROR: Python version is not correct" 
     exit 1 
    fi 

    echo "Checking numpy version..." 
    numpy_version="$(/opt/miniconda/envs/MyEnv/bin/python -c 'import numpy; print(numpy.__version__)')" 
    if [ "$numpy_version" == "1.12.1" ]; then 
     echo "Numpy version is correct: $numpy_version" 
    else 
     echo "ERROR: Numpy version is not correct" 
     exit 1 
    fi 

    echo "Checking scipy version..." 
    scipy_version="$(/opt/miniconda/envs/MyEnv/bin/python -c 'import scipy; print(scipy.__version__)')" 
    if [ "$scipy_version" == "0.19.0" ]; then 
     echo "Scipy version is correct: $scipy_version" 
    else 
    echo "ERROR: Scipy version is not correct" 
     exit 1 
    fi 

    echo "Checking scikit-learn version..." 
    scikit_version="$(/opt/miniconda/envs/MyEnv/bin/python -c 'import sklearn; print(sklearn.__version__)')" 
    if [ "$scikit_version" == "0.18.1" ]; then 
     echo "Scikit-learn version is correct: $scikit_version" 
    else 
     echo "ERROR: scikit-learn version is not correct" 
     exit 1 
    fi 
else 
    echo "ERROR: Miniconda Python installation was not found." 
    exit 1 
fi 

这是安装脚本。

[[email protected] SOURCES]$ cat install.sh 
#!/bin/bash 
echo "Extracting dependencies..." 
tar -zvxf /usr/bin/foo-1.0.tar.gz -C /tmp 
echo "Installing Miniconda..." 
sudo sh /tmp/miniconda.sh -b -p /opt/miniconda 
echo "Creating environment..." 
sudo /opt/miniconda/bin/conda create -p /opt/miniconda/envs/MyEnv --file /tmp/packages.txt 

而且这些都是我的项目的依赖:

@EXPLICIT 
file:///tmp/dependencies/libgfortran-3.0.0-1.tar.bz2 
file:///tmp/dependencies/mkl-2017.0.1-0.tar.bz2 
file:///tmp/dependencies/numpy-1.12.1-py36_0.tar.bz2 
file:///tmp/dependencies/openssl-1.0.2k-2.tar.bz2 
file:///tmp/dependencies/pip-9.0.1-py36_1.tar.bz2 
file:///tmp/dependencies/python-3.6.0-0.tar.bz2 
file:///tmp/dependencies/readline-6.2-2.tar.bz2 
file:///tmp/dependencies/scikit-learn-0.18.1-np112py36_1.tar.bz2 
file:///tmp/dependencies/scipy-0.19.0-np112py36_0.tar.bz2 
file:///tmp/dependencies/setuptools-27.2.0-py36_0.tar.bz2 
file:///tmp/dependencies/sqlite-3.13.0-0.tar.bz2 
file:///tmp/dependencies/tk-8.5.18-0.tar.bz2 
file:///tmp/dependencies/wheel-0.29.0-py36_0.tar.bz2 
file:///tmp/dependencies/xz-5.2.2-1.tar.bz2 
file:///tmp/dependencies/zlib-1.2.8-3.tar.bz2