Delete prepare shell when archive static library and update manual installation doc. (#2685)

* Delete prepare shell when archive static library and update manual installation Doc

* Update the Manual Install Guide, with both the Build SDWebImage as Framework or Static Library, as well as using SDWebImage as Sub Xcode Project

* Re-format the Manual Installation Guide to make it easy to read

* Updated to the latest Manual Install Guide

* Update the latest manual install guide
This commit is contained in:
Kinarobin 2019-04-10 16:45:48 +08:00 committed by DreamPiggy
parent 767a6643f8
commit 959a1618cb
2 changed files with 137 additions and 34 deletions

View File

@ -1,33 +1,154 @@
### Installation by cloning the repository ## Manual Installation Guide
### Build SDWebImage as Framework or Static Library
For most user, to use SDWebImage, just need to build SDWebImage source code into a framework or static library.
For framework, you can choose to use Dynamic Framework (Link during runtime) or Static Framework (Link to the main executable file like Static Library).
It's strongly recommended to use Framework instead of Static Library. Framework can bundle resource and header files together, and have module map for clang module. Which make it easy to use.
And more importantly, Swift can only import the Objective-C code by using modular framework, or using the Bridging Header. (Bridging header contains its own disadvantage but this is beyond the topic).
#### Clone the repository:
In order to gain access to all the files from the repository, you should clone it.
``` ```
git clone --recursive https://github.com/SDWebImage/SDWebImage.git git clone https://github.com/SDWebImage/SDWebImage.git
``` ```
... TO BE CHECKED AND DESCRIBED IN DETAIL Then open the `SDWebImage.xcodeproj`.
### Add dependencies #### Select the Build Scheme you need
- In you application project apps target settings, find the "Build Phases" section and open the "Link Binary With Libraries" block: - `SDWebImage` for dynamic framework. You can also change the `Mach-O Type` to `Static Library` to build static framework in `Build Settings`.
- Click the "+" button again and select the "ImageIO.framework", this is needed by the progressive download feature: - `SDWebImage Static` for static library.
- `SDWebImageMapKit` for MapKit sub component only.
### Add Linker Flag #### Select Build Platform you need
Open the "Build Settings" tab, in the "Linking" section, locate the "Other Linker Flags" setting and add the "-ObjC" flag: - `My Mac` for macOS platform.
- `Generic iOS Device` for iOS platform.
- `Generic tvOS Device` for tvOS platform.
- `Generic watchOS Device` for watchOS platform.
- Simulator Device for Simulator platform.
![Other Linker Flags](https://user-images.githubusercontent.com/6919743/30030628-be2daf6a-91c0-11e7-8b5c-e0ac92d16b80.png) #### Prepare for archive
If you want to build framework for Real Device, don't try to click `Build` (Command + R). Because by default it will use the `DEBUG` configuration, which is not suitable for production. It's mostly used for Simulator.
Instead, you can use `Archive`. But before we click the button, you need some prepare in the `Build Settings`.
Change the `Skip Install` to `NO`. Or the archived product will not contains any framework.
You can do this by modify the xcconfig file `Module-Shared.xcconfig`. Or you can change it using Xcode GUI.
Alternatively, if this causes compilation problems with frameworks that extend optional libraries, such as Parse, RestKit or opencv2, instead of the -ObjC flag use:
``` ```
-force_load SDWebImage.framework/Versions/Current/SDWebImage SKIP_INSTALL = NO
``` ```
If you're using Cocoa Pods and have any frameworks that extend optional libraries, such as Parsen RestKit or opencv2, instead of the -ObjC flag use: #### Build the Framework or Static Library
Now, you can click the `Archive` button (`Product -> Archive`). After the build success. Xcode will pop-up the Organizer window.
Click `Distribute Content`. Then ensure the `Built Products` is selected. Click `Next` and select a build folder your want to export. Click `Export`.
You can find a `SDWebImage.framework`, or `libSDWebImage.a` and the Headers Files inside the build folder.
![](https://user-images.githubusercontent.com/6919743/55800822-2bd83880-5b07-11e9-8d72-0d57a848aaf4.png)
##### Note for Universal (Fat) Framework
If you need to build Universal Framework (for Simulator and Real Device). You need some command line to combine the framework.
For example, if you already built two frameworks, `iOS/SDWebImage.framework` for iOS Real Device, `Simulator/SDWebImage.framework` for Simulator.
``` ```
-force_load $(TARGET_BUILD_DIR)/libPods.a mkdir Universal/
cp -R iOS/SDWebImage.framework Universal/SDWebImage.framework
lipo -create Simulator/SDWebImage.framework/SDWebImage iOS/SDWebImage.framework/SDWebImage -output Universal/SDWebImage.framework/SDWebImage
``` ```
and this:
For Static Library, just do the same thing.
``` ```
$(inherited) mkdir Universal/
lipo -create Simulator/libSDWebImage.a iOS/libSDWebImage.a -output Universal/libSDWebImage.a
``` ```
#### Link the Framework or Static Library to your project
Under your Project folder. You can create a `Vendor` folder to place the Framework or Static Library.
##### For Framework (Dynamic or Static)
For Framework (Dynamic or Static), the Headers are inside the framework. Just copy the `SDWebImage.framework` into the `Vendor` folder.
If your project is App project and using Dynamic Framework. You need to click `Embedded Binaries`. Select `Add Other...` and select the `SDWebImage.framework`. Xcode automatically add it into the `Linked Frameworks and Libraries` as well.
If not (Framework project or using Static Framework). Click
click `Linked Frameworks and Libraries`. Select `Add Other...` and select the `SDWebImage.framework`.
Then all things done if you use Framework.
![](https://user-images.githubusercontent.com/6919743/55804348-af495800-5b0e-11e9-828c-70711ea5fdca.png)
##### For Static Library
For Static Library, you need copy both the `libSDWebImage.a` as well as the Headers into the `Vendor` folder.
![](https://user-images.githubusercontent.com/6919743/55804133-4e218480-5b0e-11e9-86ac-f17aabf6e0c5.png)
Open your application Xcode Project, click `Linked Frameworks and Libraries`. Select `Add Other...` and select the `libSDWebImage.a`.
After link, you need to specify the Header Search Path for headers. Check Build Settings's `Header Search Path`, add the Header Search Path, where there must be a `SDWebImage` parent directory of `SDWebImage.h` this umbrella header file.
The example above can using the following path.
```
$(SRCROOT)/Vendor
```
Then all things done if you use Static Library.
#### Reference
[Technical Note TN2435 - Embedding Frameworks In An App](https://developer.apple.com/library/archive/technotes/tn2435/_index.html)
### Using SDWebImage as Sub Xcode Project
You can also embed SDWebImage as a Sub Xcode Project using in your Xcode Project/Workspace. This can be used for some specify environment which does not support external dependency manager.
#### Clone the repository as submodule
To embed the Sub Xcode Project, you can simply add SDWebImage entire project using Git Submodule.
```
cd Vendor/
git submodule add https://github.com/SDWebImage/SDWebImage.git
```
Note: If your project don't using Git Submodule, just copy the entire repo of SDWebImage to that Vendor folder, and you can add to your own Version Control tools.
However, using Git Submodule can make it easy to upgrade framework version and reduce Git repo size.
#### Add `SDWebImage.xcodeproj` into your Workspace/Project
Just drag the `SDWebImage.xcodeproj` you cloned, into your Xcode Workspace/Project 's Project Navigator.
For Xcode Workspace, you can put it the same level of your App Project.
For Xcode Project, you can put it inside your App Project.
![](https://user-images.githubusercontent.com/6919743/55799669-802de900-5b04-11e9-84c0-08d4d9452549.png)
#### Link to your App/Framework Target
To use SDWebImage, you should link the `SDWebImage` target.
Go to your App/Framework target's `General` page. Then click `Lined Frameworks and Libraries`, and add the `SDWebImage.framework` or `libSDWebImage.a` (Depends on your use case).
Then all things done.
![](https://user-images.githubusercontent.com/6919743/55799628-68eefb80-5b04-11e9-8f0b-4b7818c5d1fd.png)

View File

@ -874,7 +874,6 @@
53761308155AD0D5005750A4 /* Sources */, 53761308155AD0D5005750A4 /* Sources */,
53761311155AD0D5005750A4 /* Frameworks */, 53761311155AD0D5005750A4 /* Frameworks */,
53761315155AD0D5005750A4 /* Headers */, 53761315155AD0D5005750A4 /* Headers */,
539F912A16316D0500160719 /* Prepare Framework */,
); );
buildRules = ( buildRules = (
); );
@ -955,23 +954,6 @@
}; };
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
539F912A16316D0500160719 /* Prepare Framework */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Prepare Framework";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "set -e\n\nmkdir -p \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n\n# Link the \"Current\" version to \"A\"\n/bin/ln -sfh A \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/Current\"\n/bin/ln -sfh Versions/Current/Headers \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Headers\"\n/bin/ln -sfh \"Versions/Current/${PRODUCT_NAME}\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}\"\n\n# The -a ensures that the headers maintain the source modification date so that we don't constantly\n# cause propagating rebuilds of files that import these headers.\n/bin/cp -a \"${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
4A2CADFA1AB4BB5300B6BC39 /* Sources */ = { 4A2CADFA1AB4BB5300B6BC39 /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;